Tag: 散列表

为什么散列表扩展通常是通过加倍大小来完成的?

我已经做了一些关于散列表的研究,并且按照经验法则运行,当有一定数量的条目时(无论是最大值还是通过75%的加载因子),散列表都应该被扩展。 几乎总是build议将散列表的大小加倍(或加1,即2n + 1)。 但是,我一直没有find一个很好的理由。 为什么要扩大一倍,而不是增加25%,或者增加到下一个素数或下一个素数(如三个)的大小? 我已经知道,select一个初始哈希表大小是一个好主意,至less如果你的哈希函数使用通用哈希等模数。 而且我知道这就是为什么通常build议做2n + 1而不是2n(例如http://www.concentric.net/~Ttwang/tech/hashsize.htm ) 然而,正如我所说,我还没有看到任何真正的解释,为什么加倍或加一加实际上是一个不错的select,而不是其他一些方法为新的散列表select一个大小。 (是的,我读过哈希表维基百科的文章:) http://en.wikipedia.org/wiki/Hash_table

C最小的散列函数?

我不能使用boost:hash,因为我必须坚持使用C,不能使用C ++。 但是,我需要散列大量(10K到100K)的令牌string(长度为5到40个字节),以便在其中search最快。 MD5,SHA1或任何长的散列函数似乎太重了一个简单的任务,我没有做密码学。 另外还有存储和计算成本。 所以我的问题是: 在大多数实际情况下,最简单的散列algorithm可以确保防冲突。 多less位用于散列值? 我正在开发32位系统。 Perl / Python中的哈希algorithm是否也使用32位哈希? 还是我必须跳到64? 关于通用脚本语言中散列表的实现:实现是否检查冲突,还是我可以完全避免该部分?

在Python中提高超大字典的性能

我发现,如果我在开头初始化一个空字典,然后在for循环中添加元素到字典中(大约110,000个键,每个键的值是一个列表,循环中也增加),速度降低为for循环去。 我怀疑问题是,字典在初始化时并不知道密钥的数量,而且它并没有做一些非常聪明的事情,所以也许存储冲突变得相当频繁,并且速度变慢了。 如果我知道键的数量,确切地说是那些键,是否有任何方式在Python中使字典(或哈希表)更有效地工作? 我隐约记得,如果你知道密钥,你可以巧妙地devise哈希函数(完美哈希?),并预先分配空间。

Python中的哈希映射

我想在Python中实现一个HashMap。 我想问一个用户input。 取决于他的input,我从HashMap中检索一些信息。 如果用户inputHashMap的一个键,我想检索相应的值。 我如何在Python中实现这个function? HashMap<String,String> streetno=new HashMap<String,String>(); streetno.put("1", "Sachin Tendulkar"); streetno.put("2", "Dravid"); streetno.put("3","Sehwag"); streetno.put("4","Laxman"); streetno.put("5","Kohli")

Shell脚本中的关联数组

我们需要一个脚本来模拟关联数组或像Shell数据结构的脚本,任何一个正文?

.NET的HashTable Vs字典 – 字典可以一样快吗?

我想弄清楚什么时候以及为什么要使用Dictionary或HashTable。 我在这里做了一些search,发现人们在谈论“词典”的通用优势,我完全同意这个观点,这个优势在拳击和拆箱方面略有提升。 但是我也读了Dictionary,它并不总是按照它们插入的顺序返回对象,它对它进行sorting。 作为一个HashTable将在哪里。 据我所知,这导致HashTable在某些情况下快得多。 我的问题是,这些情况可能是什么? 我在上面的假设中错了吗? 你可以用什么样的情况来select一个在另一个之上,(是的,最后一个是有点模糊的)。

如何在哈希表和Trie(前缀树)之间进行select?

所以如果我不得不在哈希表或前缀树之间进行select,那么导致我select哪一个的区别因素是什么。 从我自己的天真的angular度来看,似乎使用一个特里特有一些额外的开销,因为它不存储为一个数组,但就运行时间而言(假设最长的键是最长的英文单词),它可以基本上是O (1)(相对于上限)。 也许最长的英文单词是50个字符? 一旦获得索引,哈希表就会立即查找。 散列键获得索引,但似乎可以轻松地采取近50个步骤。 有人能给我提供一个更有经验的观点吗? 谢谢!

Java使用什么散列函数来实现Hashtable类?

从CLRS这本书(“algorithm简介”)中,有几个哈希函数,比如mod,multiply等。 Java使用什么散列函数将键映射到插槽? 我已经看到这里有一个问题, 在Java语言中使用哈希函数 。 但是这个问题没有回答,我想这个问题的答案是错误的。 它说,hashCode()让你做你自己的Hashtable散列函数,但我认为这是错误的。 hashCode()返回的整数是Hashtble的真正键,然后Hashtable使用散列函数来散列hashCode()。 这个答案意味着Java给了你一个给Hashtable一个哈希函数的机会,但不是,这是错误的。 hashCode()提供了真正的密钥,而不是散列函数。 那么Java使用的哈希函数究竟是什么呢?

C – 使用strcmp分割错误?

我似乎在strcmp函数的某处出现了分段错误。 我对C仍然很陌生,我不明白为什么它给了我错误。 int linear_probe(htable h, char *item, int k){ int p; int step = 1; do { p = (k + step++) % h->capacity; }while(h->keys[p] != NULL && strcmp(h->keys[p], item) != 0); return p; } GDB: Program received signal SIGSEGV, Segmentation fault. 0x0000003a8e331856 in __strcmp_ssse3 () from /lib64/libc.so.6 (gdb) frame 1 #1 0x0000000000400ea6 in linear_probe […]

元组(或数组)作为C#中的字典键

我正在试图在C#中创build一个字典查找表。 我需要将一个三元组的值parsing为一个string。 我尝试使用数组作为键,但没有奏效,我不知道还有什么要做。 在这一点上,我正在考虑做一本字典词典,但是这可能不是很漂亮的看,虽然这是我如何在JavaScript中做到这一点。