晕头了,居然问错问题了。问题应该是:找出集合A和集合B的交集。如:for I := low(A) to High(A) do for J := low(B) to High(B) do begin if A[I] = B[J] then begin // OK, find, continue end; end目地就是如此,但不用说大家都知道速度N慢了。
这样的问题在noi教学中属于基础问题,当你要看一个元素是否在一个集合中时,利用Hash散列表的效率最高。代码我已经写好了,复杂度:5000+5000。delphi5下通过: program AB5000; {$APPTYPE CONSOLE}const MaxVal = 30000;var a, b: array [0..5000] of Integer; d: array [0..MaxVal-1] of Byte; i: Integer;begin // 向数组a,b中填入随机数据。 Randomize; for i:=0 to 5000 do begin a[i] := Random(MaxVal); b[i] := Random(MaxVAl); end;// 清空Hash表 FillChar(d, 30000*Sizeof(Byte), 0); // 构造数组a的Hash表 for i:=0 to 5000 do Inc(d[a[i] mod MaxVal]); // 在数组a的Hash表中查找数组b的元素 for i:=0 to 5000 do if d[b[i] mod MaxVal]<>0 then Write(b[i], ' '); Writeln; Readln; end.
大量文本文件的数据检索,你试试用trie结构吧。这是一种“压缩”存储的结构,应该可以符合楼主的要求。 下面简述一下trie结构: 比如有字符串a,abc,abd,那么你的trie结构就是这样一棵树 a b c d 每缩进一次表示下一级。 由于共同前缀的字符串多多,因此这棵所谓的“26叉树”“极”为不满,楼主试一下吧。 具体的代码容我找找呵 ^^
if Set1 in Set2 theneg:
if ['1','3'] in ['1','2','3'] then
set2==>从100M的文本文件取出来的数据这样就不可以了吧。
for J := low(B) to High(B) do
begin
if A[I] = B[J] then
begin
// OK, find, continue
end;
end目地就是如此,但不用说大家都知道速度N慢了。
内存表可以使用SqlMemTable
另:内存操作指将文件的内容copy到内存进行操作,量小的情况下,都是会很快的,但是量大的情况下,不是说加内存就可以解决的问题了。
如果数据过大的话,也可以考虑用字符串的前缀树或二叉搜索树之类的东西。
这样的问题在noi教学中属于基础问题,当你要看一个元素是否在一个集合中时,利用Hash散列表的效率最高。代码我已经写好了,复杂度:5000+5000。delphi5下通过:
program AB5000;
{$APPTYPE CONSOLE}const
MaxVal = 30000;var
a, b: array [0..5000] of Integer;
d: array [0..MaxVal-1] of Byte;
i: Integer;begin
// 向数组a,b中填入随机数据。
Randomize;
for i:=0 to 5000 do
begin
a[i] := Random(MaxVal);
b[i] := Random(MaxVAl);
end;// 清空Hash表
FillChar(d, 30000*Sizeof(Byte), 0);
// 构造数组a的Hash表
for i:=0 to 5000 do
Inc(d[a[i] mod MaxVal]);
// 在数组a的Hash表中查找数组b的元素
for i:=0 to 5000 do
if d[b[i] mod MaxVal]<>0 then
Write(b[i], ' ');
Writeln;
Readln;
end.
如果量大的情况下,如1000W的量,建立一个平衡二叉树,这个都要耗内存:1000W * SizeOf(Pointer) = 200M的内存,那数据库的查找应该不是属于这种方法吧。这几天在做,后天一看,做的时候,少了一个0,我晕菜,内存需要涨10倍,全部否定了。:( 能不能简单讲一下你所说的方法了?>>前缀树或二叉搜索树
因为这东西不急,我只是想想明白数据库的上亿条数据是怎么查找的,有点不自量力了,现在发现。
然后数据A按一个段值,再进行HASH,建立HASH表B定位索引数据A的数据B
数据B的量肯定远远小于数据A的量,这样加载到内存就可行了。只想到这些了,不过,做起来好像有点麻烦了。
就是$01, $02, $04, $08, $10, $20, $40, $80,这样的话,MaxVal的数组可以变成:MaxVal div 8,嘿,量大大的减少。刚才试了下,速度还可以。keke
下面简述一下trie结构:
比如有字符串a,abc,abd,那么你的trie结构就是这样一棵树
a
b
c
d
每缩进一次表示下一级。
由于共同前缀的字符串多多,因此这棵所谓的“26叉树”“极”为不满,楼主试一下吧。
具体的代码容我找找呵 ^^