以前看过这个贴子,有个虾哥说到一个算法,好像只是把它遍历了一次就检查出来了,不知怎么弄了。谁有这个贴的链接的或保留有此算法的,帮忙。谢谢。

解决方案 »

  1.   

    in
    if Set1 in Set2 theneg:
    if ['1','3'] in ['1','2','3'] then
      

  2.   

    不好意思,我没说清楚。set1==>从10M的文本文件取出来的数据
    set2==>从100M的文本文件取出来的数据这样就不可以了吧。
      

  3.   

    晕头了,居然问错问题了。问题应该是:找出集合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慢了。
      

  4.   

    主要看你的文件是什么样的,如果是csv(逗号分隔的文本文件)或tsv(tab分隔的文本文件),建议装载到内存表,建立索引,然后用SQL语句比较。本人试验过,字段个数在30个内,2w行与2w行比较,时间小于5秒。
    内存表可以使用SqlMemTable
      

  5.   

    2W与2W需要5秒, :(主要问题是操作的量大,用数据库的操作比较慢,现在做一次操作都需要半小时到2个小时,所以,就想着用其它操作方法,但现在问题是两个量大的文件进行比较这个操作先要解决。所以,先不考虑这个数据库解决方案。
    另:内存操作指将文件的内容copy到内存进行操作,量小的情况下,都是会很快的,但是量大的情况下,不是说加内存就可以解决的问题了。
      

  6.   

    我好像那个贴子是顶置过的,所以看到一下,那时记得怎么弄怎么弄的,现在记不起来了,郁闷ing...
      

  7.   

    2W与2W当然需要5秒,这个时间包括装载两个文件文件,建立索引,执行SQL。如果仅仅执行SQL,时间还不到1秒
      

  8.   

    当初我就回答过这个问题,那个贴我自己也找不到了,给个思路:用hash表优化。先扫a,将其数据标在集合中,再扫b,看是否有不在a中的元素。ok。
    如果数据过大的话,也可以考虑用字符串的前缀树或二叉搜索树之类的东西。
      

  9.   

    回复人:QuickKeyBoard()  二级(初级)  信誉:100      2004-12-22 10:31:07  得分:40
     
     
     这样的问题在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.
     
      

  10.   

    感谢jinjazz(近身剪(充电中...)) QuickKeyBoard解答的那个算法,你也来ing,我先看看,晚上我看看代码,看看能不能做出来,主要是量太大。有个思路好多了,多谢ing.
      

  11.   

    按QuickKeyBoard的算法,这个求集合A和集合B的复杂度只需要:Len(A) + Len(B)。比起俺想的:Len(A) * Len(B),当然要发个贴子求一下。呵,多谢先。
      

  12.   

    原贴在这里,找到了。:)http://topic.csdn.net/topicfiles/2004/12/20/13/3660145.xml
      

  13.   

    2 QuickKeyBoard:
      如果量大的情况下,如1000W的量,建立一个平衡二叉树,这个都要耗内存:1000W * SizeOf(Pointer) = 200M的内存,那数据库的查找应该不是属于这种方法吧。这几天在做,后天一看,做的时候,少了一个0,我晕菜,内存需要涨10倍,全部否定了。:( 能不能简单讲一下你所说的方法了?>>前缀树或二叉搜索树
    因为这东西不急,我只是想想明白数据库的上亿条数据是怎么查找的,有点不自量力了,现在发现。
      

  14.   

    按理来说应该是建立二次HASH索引,不过想不太明白二次的HASH索引是怎么做来着。一个4字节的整型数据,应该怎么样做这个HASH表了,不好意思,不接触过这方面的东西。
      

  15.   

    是不是这样:  将第一HASH表值,作为了一个数据A,此数据A排序好:Value1, Value2, Value3...
      然后数据A按一个段值,再进行HASH,建立HASH表B定位索引数据A的数据B
      数据B的量肯定远远小于数据A的量,这样加载到内存就可行了。只想到这些了,不过,做起来好像有点麻烦了。
      

  16.   

    想了个法子来处理MaxVal过大,一个BYTE来表示一个HASH值的,浪费了点,它可以表示8个HASH值
    就是$01, $02, $04, $08, $10, $20, $40, $80,这样的话,MaxVal的数组可以变成:MaxVal div 8,嘿,量大大的减少。刚才试了下,速度还可以。keke
      

  17.   

    大量文本文件的数据检索,你试试用trie结构吧。这是一种“压缩”存储的结构,应该可以符合楼主的要求。
    下面简述一下trie结构:
    比如有字符串a,abc,abd,那么你的trie结构就是这样一棵树
    a
     b
      c
      d
    每缩进一次表示下一级。
    由于共同前缀的字符串多多,因此这棵所谓的“26叉树”“极”为不满,楼主试一下吧。
    具体的代码容我找找呵 ^^
      

  18.   

    笛卡儿乘积应该,sql 里面的inner join效率比较高,