求均匀分配的算法,具体见内 ( 积分: 200 )

  • 主题发起人 主题发起人 hope2005
  • 开始时间 开始时间
H

hope2005

Unregistered / Unconfirmed
GUEST, unregistred user!
有N个文本文件,每个文件里都是不同行数的一列字符(最大可有20万行),现要求将N个文件合并,在合并文件中,相对平均分配原有文件的字符。
简单示例: 文件A 文件B 文件C
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4
B5
新文件: B1 A1 C1 B2 A2 C2 B3 A3 C3 B4 A4 B5
请大家提供一算法实现,有简单代码说明更好。谢谢!
 
有N个文本文件,每个文件里都是不同行数的一列字符(最大可有20万行),现要求将N个文件合并,在合并文件中,相对平均分配原有文件的字符。
简单示例: 文件A 文件B 文件C
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4
B5
新文件: B1 A1 C1 B2 A2 C2 B3 A3 C3 B4 A4 B5
请大家提供一算法实现,有简单代码说明更好。谢谢!
 
打开3个读文件,打开一个写文件
从3个读文件里分别读一行,然后按顺序(或者你自己定义的顺序)写入写文件里
不知道你要的是不是这样的效果?
 
问题是我怎么定这个顺序呢
 
那你说的‘平均分配’是什么意思啊?
 
不会是要分割吧
 
就是说原来某个文件里的字符不要在新文件中连续出现,要相对均匀分布在新文件中。
 
简单,用三个TStringList来读文件,取得三个StrigList的最大行数,用这个最大行数来循环
procedure TForm1.Button1Click(Sender: TObject);
var
sla,slb,slc:TStringList;
i,j :integer;
s:string;
begin
sla := TStringList.Create;
slb := TStringList.Create;
slc := TStringList.Create;
sla.LoadFromFile('文件A');
slb.LoadFromFile('文件B');
slc.LoadFromFile('文件C');
i := Max(sla.Count,slb.Count);
i := Max(i,slc.Count);
s := '';
for j := 0 to i-1 do
begin
if j < slb.Count then
s := s + slb.Strings[j]+ ' ';
if j < sla.Count then
s := s + sla.Strings[j]+ ' ';
if j < slc.Count then
s := s + slc.Strings[j]+' ';
end;
sla.Text := s;
sla.SaveToFile('新文件');
sla.Free;
slb.Free;
slc.Free;

end;
 
jennykiller,你这个在循环中已经是假设文件B是最大行数、文件A其次、文件C最小的了
而且实际上不止三个文件。
 
我只是抛砖引玉啊,循环是按三个文件的最大行数来做的。
i := Max(sla.Count,slb.Count);
i := Max(i,slc.Count);

那你可以自己修改一下啊,我又不知道你有几个文件,是不是添加到新文件的顺序要根据原文件的行数的大小排序啊?如果是这样你还要保存一个文件行数的顺序,循环里面要根据这个顺序来处理,呵呵,自己动动脑筋吧。别指望别人把代码全部写好了给你。
 
看看行不行:
type filearr = Array of TextFile;

procedure WriteAFile(filearr:filearr;filecount:integer;var towritefile:textfile);
var i,j:integer;
srcs,tars:string;
tmptxtfile : TextFile;
begin
if filecount>1 then
begin
tars := '';
for i:= filecount-1 downto 0 do
begin
if not eof(filearr) do
begin
readln(filearr,srcs);
tars := tars + srcs;
end
else
begin
tmptxtfile := filearr[filecount-1];
filearr[filecount-1] := filearr;
filearr := tmptxtfile;
closefile(filearr[filecount-1]);
filecount := filecount-1;
end;
end;
writeln(towritefile,tars);
WriteAFile(filearr,filecount,towritefile);
end
else
begin
//略。。。吧最后一个写进去,如果还想更均匀,用随机数控制写入位置
end;
end;
 
jxyghm是用的顺序插入的方法吧
比如文件A中有10个字符,文件B有6个,文件C只有3个
ABCABCABCABABABAAAA
只能保证前面是平均的,但后面的即很集中
 
我的思路是无论你有多少文件,当可能出现一个文件中的值很密集,那么就只剩下两个文件了,因为目的文件的每一行都是由原文件的相同行号的一行生成,所以最后一定剩下一个文件中的一系列字符,如果将这些剩余字符以随机方式在插入目标文件,就比较均匀了。
你的要求是相对均匀,绝对均匀也是不容易达到的
 
多人接受答案了。
 
后退
顶部