一个复杂算法的问题(61分)

  • 主题发起人 主题发起人 哦哦哦哦哦
  • 开始时间 开始时间

哦哦哦哦哦

Unregistered / Unconfirmed
GUEST, unregistred user!
我在接收文件时设定了2个值,一个作用是表示当前接收的文件行数,另一个作用是通过比较这两个值,判断接收数据是否正确。现在在实际接收时发现多种情况:
1。接收数据正确,但中间丢失几行数据
11 11
12 12
15 15
2。接收数据有误
11,1000
12,12
13,13
3。接收数据有误,并且有数据丢失
11,1010
1000,15
16,16
其它的可能性也有,现在需要一个算法,能通过比较前后的行数判断是否丢失数据,把丢失的部分空出来,还要2个值之间比较,判断数据是否有误,把错误的改正过来。这个算法我琢磨了很久,要考虑的可能性很多,比较复杂,特在此发贴求救。
 
如果你能够根据前一行的内容确定后一行的内容(例如:某行是'11',那么后一行就应该
是'12')——那么你只要传送起始行以及总行数就可以了。如果不能唯一确定,那么你的有
效性规则能否描述呢?
 
是这样每行的行号有两个,在首和尾,我想可以先比较这两个数,如果一样就认为此数是对的,然后和它前一个后一个,如果连续,就表示没有丢数据,如果一开始比较的两个数不同,就要分别同它前后的数比较,如果能连续上,就认为哪个是对的......由于可能性太多,复杂啊......
 
我觉得判断一下文件每行的首尾是否和行号一致即可。
下面的代码用于判断一个TStrings的每行是否符合这样的规则:
1,................,1
2,.....................,2
3,...........,3
...
...
function CheckLines(Lines:TStrings):Boolean;
var
i:Integer;
Str:String;
begin
Result:=false;
for i:=0 to Lines.Count-1do
begin
Str:=Format('%d,',[i+1]);
//行首字符——设第一行是 "1,"
if Copy(Lines,1,Length(Str))<>Str then
exit;
Str:=Format(',%d',[i+1]);
//行尾字符——.......... ",1"
if Copy(Lines,Length(Lines)-Length(Str)+1,Length(Str))<>Str then
exit;
end;
Result:=true;
end;

如果第一行的行号不一定是1,那么大可以在读入第一行的时候将起始行号读进来——如
果是这样的话,我有一个问题——如何判断第一行之前是否有数据丢失呢?
 
您可能没明白我的意思,我已经把每行的两个行号提出来了,分别在两个数组中,现在要做的是通过比较,纠正错误的数据,并把丢失的数据空出来,比如 :
11 11
12 23333
14 14
用程序整理后
11 11
12 12
0 0
14 14
至于第一行如果两个数据不一样,只好和后面的数据比较,比如可以这样:如果第一行数据不同,跳过,顺次向后找,直到相邻的数据之差为一,且两个行号相同,就认为这个是对的,然后再向前比较......具体算法怎么写,我也头痛啊
 
我以前正好写了个类似的
zhongguo_liyun@tom.com
 
代码收到了,研究中,谢谢!
 
后退
顶部