To: MaXsl
要跟别人比较,又要一次也不遍历对方? 你厉害,如果有这种算法,请你也告诉我一下。
确切的可以说,理论如果还能有遍历次数少于 LA.Count + LA.Count 的算法,那就奇怪了。
To: yeskert1
表面上看,你的算法是只遍历了一次List1,但是可知道 indexof 函数也会遍历一次LIST2,所以这个算法的效率实际上是 List1.Count * List2.Count
function TStringList.IndexOf(const S: string): Integer;
begin
if not Sorted then Result := inherited IndexOf(S) else
if not Find(S, Result) then Result := -1;
end;
function TStrings.IndexOf(const S: string): Integer;
begin
for Result := 0 to GetCount - 1 do
if CompareStrings(Get(Result), S) = 0 then Exit;
Result := -1;
end;
function TStringList.Find(const S: string
var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FCount - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := CompareStrings(FList^.FString, S);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
if Duplicates <> dupAccept then L := I;
end;
end;
end;
Index := L;
end;