判断一个集合是否在另一集合中,有个算法叫什么来着?

saoren 2005-11-17 02:07:42
以前看过这个贴子,有个虾哥说到一个算法,好像只是把它遍历了一次就检查出来了,不知怎么弄了。

谁有这个贴的链接的或保留有此算法的,帮忙。谢谢。
...全文
741 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexanda2000 2006-06-15
  • 打赏
  • 举报
回复
学习一下~~
todouwang 2006-06-15
  • 打赏
  • 举报
回复
笛卡儿乘积应该,sql 里面的inner join效率比较高,
tybb 2006-06-14
  • 打赏
  • 举报
回复
mark
QuickKeyBoard 2006-02-24
  • 打赏
  • 举报
回复
大量文本文件的数据检索,你试试用trie结构吧。这是一种“压缩”存储的结构,应该可以符合楼主的要求。
下面简述一下trie结构:
比如有字符串a,abc,abd,那么你的trie结构就是这样一棵树
a
b
c
d
每缩进一次表示下一级。
由于共同前缀的字符串多多,因此这棵所谓的“26叉树”“极”为不满,楼主试一下吧。
具体的代码容我找找呵 ^^
yyfhz 2006-02-22
  • 打赏
  • 举报
回复
如果是有序数列就方便拉
summersky204608 2006-02-03
  • 打赏
  • 举报
回复
向高手学习!
saoren 2006-01-24
  • 打赏
  • 举报
回复
前段转了半天,昨天突然想到的,人比较懒,现在才想到。不知还有人有没有其它方法?
saoren 2006-01-24
  • 打赏
  • 举报
回复
想了个法子来处理MaxVal过大,一个BYTE来表示一个HASH值的,浪费了点,它可以表示8个HASH值
就是$01, $02, $04, $08, $10, $20, $40, $80,这样的话,MaxVal的数组可以变成:MaxVal div 8,嘿,量大大的减少。刚才试了下,速度还可以。keke

summersky204608 2005-11-24
  • 打赏
  • 举报
回复
学习
saoren 2005-11-22
  • 打赏
  • 举报
回复
是不是这样:

将第一HASH表值,作为了一个数据A,此数据A排序好:Value1, Value2, Value3...
然后数据A按一个段值,再进行HASH,建立HASH表B定位索引数据A的数据B
数据B的量肯定远远小于数据A的量,这样加载到内存就可行了。

只想到这些了,不过,做起来好像有点麻烦了。
saoren 2005-11-22
  • 打赏
  • 举报
回复
按理来说应该是建立二次HASH索引,不过想不太明白二次的HASH索引是怎么做来着。

一个4字节的整型数据,应该怎么样做这个HASH表了,不好意思,不接触过这方面的东西。
saoren 2005-11-22
  • 打赏
  • 举报
回复
2 QuickKeyBoard:
如果量大的情况下,如1000W的量,建立一个平衡二叉树,这个都要耗内存:1000W * SizeOf(Pointer) = 200M的内存,那数据库的查找应该不是属于这种方法吧。

这几天在做,后天一看,做的时候,少了一个0,我晕菜,内存需要涨10倍,全部否定了。:(

能不能简单讲一下你所说的方法了?>>前缀树或二叉搜索树
因为这东西不急,我只是想想明白数据库的上亿条数据是怎么查找的,有点不自量力了,现在发现。
jinjazz 2005-11-18
  • 打赏
  • 举报
回复
回复人: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.

jinjazz 2005-11-18
  • 打赏
  • 举报
回复
hash表
QuickKeyBoard 2005-11-18
  • 打赏
  • 举报
回复
当初我就回答过这个问题,那个贴我自己也找不到了,给个思路:用hash表优化。先扫a,将其数据标在集合中,再扫b,看是否有不在a中的元素。ok。
如果数据过大的话,也可以考虑用字符串的前缀树或二叉搜索树之类的东西。
saoren 2005-11-18
  • 打赏
  • 举报
回复
多谢先,不过暂不讨论这个处理方法。
fjx99 2005-11-18
  • 打赏
  • 举报
回复
2W与2W当然需要5秒,这个时间包括装载两个文件文件,建立索引,执行SQL。如果仅仅执行SQL,时间还不到1秒
saoren 2005-11-18
  • 打赏
  • 举报
回复
我好像那个贴子是顶置过的,所以看到一下,那时记得怎么弄怎么弄的,现在记不起来了,郁闷ing...
saoren 2005-11-18
  • 打赏
  • 举报
回复
2W与2W需要5秒, :(

主要问题是操作的量大,用数据库的操作比较慢,现在做一次操作都需要半小时到2个小时,所以,就想着用其它操作方法,但现在问题是两个量大的文件进行比较这个操作先要解决。

所以,先不考虑这个数据库解决方案。


另:内存操作指将文件的内容copy到内存进行操作,量小的情况下,都是会很快的,但是量大的情况下,不是说加内存就可以解决的问题了。
fjx99 2005-11-18
  • 打赏
  • 举报
回复
主要看你的文件是什么样的,如果是csv(逗号分隔的文本文件)或tsv(tab分隔的文本文件),建议装载到内存表,建立索引,然后用SQL语句比较。本人试验过,字段个数在30个内,2w行与2w行比较,时间小于5秒。
内存表可以使用SqlMemTable
加载更多回复(10)

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧