由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - INTEGER搜索求建议
相关主题
一个哈希表问题请教算法题
一个integer promotion问题百度面试题,any idea?
一个关于unordered_map/hashmap的问题分别用LinkedList和HashMap构建字典树(Compact Trie)怎么做
Check if the sum of two integers in an integer array eqauls to the given number 贡献一下:本版上搜集的 Google 面试题 (转载)
这个条件语句如何写?3sum problem
请教c++数组初始化js,php,ruby和python的共同点
boost::unordered一问unsigned long long
构建一个快速查询字典(数据结构题)?hash table的size为什么最好是个质数? (转载)
相关话题的讨论汇总
话题: hash话题: bucket话题: 哈希话题: integer话题: 集合
进入Programming版参与讨论
1 (共1页)
b*******t
发帖数: 34
1
给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
里。 怎么做比较快?
HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
好。
RADIX树也是集合稠密的时候没什么优势。
有什么想法没?
g*****g
发帖数: 34805
2
通常都是先上简单的,性能不够再优化吧。比如java的integer hash就是返回integer
本身。
稠密不应该是问题。

S

【在 b*******t 的大作中提到】
: 给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
: 里。 怎么做比较快?
: HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
: 个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
: BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
: 好。
: RADIX树也是集合稠密的时候没什么优势。
: 有什么想法没?

l********t
发帖数: 878
3
any mainstream language has built-in hash functions. Do you have to write
your own hash function?
k**********g
发帖数: 989
4

S
How many (i.e. what is size of S) ?
Measured in powers of 1024, e.g. 1K, 1M, 1G, 1T, ...

【在 b*******t 的大作中提到】
: 给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
: 里。 怎么做比较快?
: HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
: 个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
: BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
: 好。
: RADIX树也是集合稠密的时候没什么优势。
: 有什么想法没?

N******K
发帖数: 10202
5
哈哈 搞个p的哈希啊
开一块内存 比如 std::array A
首先清零数据
然后 对S立面的任意 x 设置 A[x]=1;
你要节省内存 可以 用 std::array A
A和S放一起
来一个新数字 y 直接查A[y]

S

【在 b*******t 的大作中提到】
: 给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
: 里。 怎么做比较快?
: HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
: 个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
: BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
: 好。
: RADIX树也是集合稠密的时候没什么优势。
: 有什么想法没?

N******K
发帖数: 10202
6
要是整数巨大无比 unsigned long long 存不下
S集合是稀疏的 那就把整数分成几段 每段用hash 这样可以防止hash碰撞

【在 N******K 的大作中提到】
: 哈哈 搞个p的哈希啊
: 开一块内存 比如 std::array A
: 首先清零数据
: 然后 对S立面的任意 x 设置 A[x]=1;
: 你要节省内存 可以 用 std::array A
: A和S放一起
: 来一个新数字 y 直接查A[y]
:
: S

b*******t
发帖数: 34
7
我就是要性能,如果集合可能是包括大多数可表示的正整数,踫撞会很多,这样键哈希
表时每个哈希筒里会不断需要插入,这样以后査询才会快,感觉建表的开销太大了吧。
一般哈希表会有多少bucket?如果我的集合有2^32-1,每个bucket会有很多元素
简单的方法是先排序,査询时二叉搜索,但这样cache效率会比较差,因为搜索时会到
处跳

integer

【在 g*****g 的大作中提到】
: 通常都是先上简单的,性能不够再优化吧。比如java的integer hash就是返回integer
: 本身。
: 稠密不应该是问题。
:
: S

b*******s
发帖数: 5216
8
最简单的是先排序,以后都二分查找
这样不需要额外存储,速度也是logn级别的,和一般hash实现没大区别
另外如果很稠密,可以设计个好点的hash函数
比如发现数据有一半在 0-1000,其余的离散
就可以把这段做线性的array,其余的用前述方法
这样查到这一段内的是o(1),其余的是o(logn)

S

【在 b*******t 的大作中提到】
: 给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
: 里。 怎么做比较快?
: HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
: 个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
: BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
: 好。
: RADIX树也是集合稠密的时候没什么优势。
: 有什么想法没?

b*******t
发帖数: 34
9
集合里只有32位正整数,你要开数组至少要2^32/8=2^29 byte, 这不可行吧

【在 N******K 的大作中提到】
: 哈哈 搞个p的哈希啊
: 开一块内存 比如 std::array A
: 首先清零数据
: 然后 对S立面的任意 x 设置 A[x]=1;
: 你要节省内存 可以 用 std::array A
: A和S放一起
: 来一个新数字 y 直接查A[y]
:
: S

g*****g
发帖数: 34805
10
不知道你的应用是不是内存受限。这年头内存白菜价,2^32也不过4G,如果你用bitmap
不过500M。
如果涵盖大部分正整数,反转不就没几个数了。

【在 b*******t 的大作中提到】
: 我就是要性能,如果集合可能是包括大多数可表示的正整数,踫撞会很多,这样键哈希
: 表时每个哈希筒里会不断需要插入,这样以后査询才会快,感觉建表的开销太大了吧。
: 一般哈希表会有多少bucket?如果我的集合有2^32-1,每个bucket会有很多元素
: 简单的方法是先排序,査询时二叉搜索,但这样cache效率会比较差,因为搜索时会到
: 处跳
:
: integer

相关主题
请教c++数组初始化请教算法题
boost::unordered一问百度面试题,any idea?
构建一个快速查询字典(数据结构题)?分别用LinkedList和HashMap构建字典树(Compact Trie)怎么做
进入Programming版参与讨论
b*******s
发帖数: 5216
11
呵呵

bitmap

【在 g*****g 的大作中提到】
: 不知道你的应用是不是内存受限。这年头内存白菜价,2^32也不过4G,如果你用bitmap
: 不过500M。
: 如果涵盖大部分正整数,反转不就没几个数了。

N******K
发帖数: 10202
12
最大数和最小数的差值多少?

【在 b*******t 的大作中提到】
: 集合里只有32位正整数,你要开数组至少要2^32/8=2^29 byte, 这不可行吧
b*******t
发帖数: 34
13
32位问题不大,64位就不行了吧

bitmap

【在 g*****g 的大作中提到】
: 不知道你的应用是不是内存受限。这年头内存白菜价,2^32也不过4G,如果你用bitmap
: 不过500M。
: 如果涵盖大部分正整数,反转不就没几个数了。

g*****g
发帖数: 34805
14
64位你就只能老实哈希了。1v1也不过是哈希的一种。bucket多一些罢了。
总归是数字越少越好,bucket越多越好。
return (int)(value ^ (value >>> 32));

【在 b*******t 的大作中提到】
: 32位问题不大,64位就不行了吧
:
: bitmap

n*****t
发帖数: 22014
15
多级索引二叉树?先把集合分区,这样 search 的时候最终落到 cache

【在 b*******t 的大作中提到】
: 我就是要性能,如果集合可能是包括大多数可表示的正整数,踫撞会很多,这样键哈希
: 表时每个哈希筒里会不断需要插入,这样以后査询才会快,感觉建表的开销太大了吧。
: 一般哈希表会有多少bucket?如果我的集合有2^32-1,每个bucket会有很多元素
: 简单的方法是先排序,査询时二叉搜索,但这样cache效率会比较差,因为搜索时会到
: 处跳
:
: integer

d****n
发帖数: 12461
16
纯性能的话用bitset就可以了。
big range+sparse要性能可以先用bloom filter加上hash。

【在 b*******t 的大作中提到】
: 我就是要性能,如果集合可能是包括大多数可表示的正整数,踫撞会很多,这样键哈希
: 表时每个哈希筒里会不断需要插入,这样以后査询才会快,感觉建表的开销太大了吧。
: 一般哈希表会有多少bucket?如果我的集合有2^32-1,每个bucket会有很多元素
: 简单的方法是先排序,査询时二叉搜索,但这样cache效率会比较差,因为搜索时会到
: 处跳
:
: integer

g*********e
发帖数: 14401
17
std::set
N********n
发帖数: 8363
18
Just grab a good template or generic implementation of hash table to
use. No need to code it yourself. A standard hash table should be
designed well enough to handle your use cases.
b*******s
发帖数: 5216
19
对数级他显然不满意

【在 g*********e 的大作中提到】
: std::set
b*******t
发帖数: 34
20
对数级是极限了吧。 除了复杂度这些硬指标,实现也很重要,比如哪种容易并行化,
有没有好的SURVEY比较这些东西的。数组排序并2分搜索, BST, RADIX SORTING, TRIE
,B-tree, 他们的并行可行性,CACHE性能,一点一点倒是能找到,如果有文章系统的
把这些放在一块儿比较能省我不少时间。

【在 b*******s 的大作中提到】
: 对数级他显然不满意
相关主题
贡献一下:本版上搜集的 Google 面试题 (转载)unsigned long long
3sum problemhash table的size为什么最好是个质数? (转载)
js,php,ruby和python的共同点.mro是什么语言?
进入Programming版参与讨论
w****w
发帖数: 521
21
如果不需要实时加新数进去的话,总能offline找个相对均匀的bucket分布,然后
bucket内再建平衡树。


TRIE

【在 b*******t 的大作中提到】
: 对数级是极限了吧。 除了复杂度这些硬指标,实现也很重要,比如哪种容易并行化,
: 有没有好的SURVEY比较这些东西的。数组排序并2分搜索, BST, RADIX SORTING, TRIE
: ,B-tree, 他们的并行可行性,CACHE性能,一点一点倒是能找到,如果有文章系统的
: 把这些放在一块儿比较能省我不少时间。

b*******s
发帖数: 5216
22
你要是有这种总结性文章,也请给我一份,谢谢


TRIE

【在 b*******t 的大作中提到】
: 对数级是极限了吧。 除了复杂度这些硬指标,实现也很重要,比如哪种容易并行化,
: 有没有好的SURVEY比较这些东西的。数组排序并2分搜索, BST, RADIX SORTING, TRIE
: ,B-tree, 他们的并行可行性,CACHE性能,一点一点倒是能找到,如果有文章系统的
: 把这些放在一块儿比较能省我不少时间。

y***a
发帖数: 840
23
hehe..这个够不够一个MASTER THESIS?

【在 b*******s 的大作中提到】
: 你要是有这种总结性文章,也请给我一份,谢谢
:
: ,
: TRIE

w***g
发帖数: 5958
24
如果S是固定的不需要支持插入删除,并且S的取值范围确实很大,可以用perfect hash
,用大量离线计算时间换一点speedup。
你这个总得有一些约束才好优化。如果就一个generic的问题,std::set或者std::
unorderd_set基本上就是最好的了。

S

【在 b*******t 的大作中提到】
: 给一个正整数集合S(一个数组) 以及一些整数,需要快速检索这些整数是否在集合S
: 里。 怎么做比较快?
: HASH表应该是比较快, 但是应该怎么设计?比如哈希函数,建哈希表的时候落入同一
: 个BUCKET里的元素怎么组织比较好? 如果S比较稠密的话,好像不太好组织,因为
: BUCKET里面的元素需要在建里的时候排序插入。这样导致数组不好用,用链表性能又不
: 好。
: RADIX树也是集合稠密的时候没什么优势。
: 有什么想法没?

1 (共1页)
进入Programming版参与讨论
相关主题
hash table的size为什么最好是个质数? (转载)这个条件语句如何写?
.mro是什么语言?请教c++数组初始化
Gmail的IP地址异常怎么实现的boost::unordered一问
面试题 -算法?构建一个快速查询字典(数据结构题)?
一个哈希表问题请教算法题
一个integer promotion问题百度面试题,any idea?
一个关于unordered_map/hashmap的问题分别用LinkedList和HashMap构建字典树(Compact Trie)怎么做
Check if the sum of two integers in an integer array eqauls to the given number 贡献一下:本版上搜集的 Google 面试题 (转载)
相关话题的讨论汇总
话题: hash话题: bucket话题: 哈希话题: integer话题: 集合