我在JavaScript中使用哈希表,我想在哈希表中显示以下值
one -[1,10,5]
two -[2]
three -[3, 30, 300, etc.]
Run Code Online (Sandbox Code Playgroud)
我找到了以下代码.它适用于以下数据.
one -[1]
two -[2]
three-[3]
Run Code Online (Sandbox Code Playgroud)
如何将一个[1,2]值分配给哈希表以及如何访问它?
<script type="text/javascript">
function Hash()
{
this.length = 0;
this.items = new Array();
for (var i = 0; i < arguments.length; i += 2) {
if (typeof(arguments[i + 1]) != 'undefined') {
this.items[arguments[i]] = arguments[i + 1];
this.length++;
}
}
this.removeItem = function(in_key)
{
var tmp_value;
if (typeof(this.items[in_key]) != 'undefined') {
this.length--;
var tmp_value = this.items[in_key];
delete this.items[in_key];
}
return tmp_value;
}
this.getItem = …Run Code Online (Sandbox Code Playgroud) 我不能使用boost:hash因为我必须坚持使用C而不能使用C++.
但是,我需要散列大量(10K到100k)的令牌字符串(长度为5到40个字节),以便在这些字符串中搜索最快.
MD5,SHA1或任何长哈希函数对于一个简单的任务来说似乎太重了,我没有做加密.此外还有存储和计算成本.
因此我的问题是:
什么是最简单的哈希算法,可以确保在大多数实际情况下防止碰撞.
哈希值要使用多少位?我正在为32位系统开发.Perl/Python中的哈希算法是否也使用32位哈希?或者我必须跳到64?
关于常见脚本语言中哈希表的实现:实现是否检查冲突,还是可以完全避免该部分?
我一直用词典.我用Python写.
当我看到以下内容时,我正在浏览Java的HashMap源代码
//The default initial capacity - MUST be a power of two.
static final int DEFAULT_INITIAL_CAPACITY = 16;
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么这个要求首先存在?我还看到允许创建具有自定义容量的HashMap的构造函数将其转换为2的幂:
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
Run Code Online (Sandbox Code Playgroud)
为什么容量总是必须是2的幂?
此外,当执行自动重新散列时,究竟会发生什么?哈希函数也改变了吗?
我正在创建一个类似于a的结构String,除了它只处理Unicode UTF-32标量值.因此,它是一个数组UInt32.(有关更多背景,请参阅此问题.)
我希望能够将自定义ScalarString结构用作字典中的键.例如:
var suffixDictionary = [ScalarString: ScalarString]() // Unicode key, rendered glyph value
// populate dictionary
suffixDictionary[keyScalarString] = valueScalarString
// ...
// check if dictionary contains Unicode scalar string key
if let renderedSuffix = suffixDictionary[unicodeScalarString] {
// do something with value
}
Run Code Online (Sandbox Code Playgroud)
为此,ScalarString需要实现Hashable协议.我以为我可以这样做:
struct ScalarString: Hashable {
private var scalarArray: [UInt32] = []
var hashValue : Int {
get {
return self.scalarArray.hashValue // error
} …Run Code Online (Sandbox Code Playgroud) 我在Java中有一个Hashtable,想迭代表中的所有值,并在迭代时删除一个特定的键值对.
怎么可能这样呢?
我已经对哈希表进行了一些研究,并且我一直遵循经验法则,当有一定数量的条目(最大或通过75%的加载因子)时,应该扩展哈希表.
几乎总是,建议是将哈希表的大小加倍(或加倍加1,即2n + 1).但是,我没有找到一个很好的理由.
为什么要加倍大小,而不是将其增加25%,或者将其增加到下一个素数或下一个素数(例如三个)?
我已经知道,选择一个初始哈希表大小是一个素数通常是一个好主意,至少如果你的哈希函数使用模数,如通用哈希.我知道这就是为什么通常建议做2n + 1而不是2n(例如,http://www.concentric.net/~Ttwang/tech/hashsize.htm)
然而正如我所说,我没有看到任何真正的解释,为什么加倍或加倍加一个实际上是一个很好的选择,而不是选择新哈希表的大小的其他方法.
(是的,我已经阅读了关于哈希表的维基百科文章:) http://en.wikipedia.org/wiki/Hash_table
我对哈希表的时间复杂性感到困惑很多文章表明它们是"摊销的O(1)"而不是真正的命令O(1)这在实际应用中意味着什么.哈希表中的操作的平均时间复杂度是多少,实际实现中不是理论上的,为什么操作不正确O(1)?
我期待以下两个元组
>>> x = tuple(set([1, "a", "b", "c", "z", "f"]))
>>> y = tuple(set(["a", "b", "c", "z", "f", 1]))
Run Code Online (Sandbox Code Playgroud)
比较不平等,但他们不:
>>> x == y
>>> True
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我们知道java中"final"关键字的用途.在将变量声明为final时,我们必须初始化变量.比如" final int a = 10;" 我们无法改变"a"的价值.但是如果我们选择HashTable,它甚至可以添加一些值,甚至可以将HashTable声明为final.
例::
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>()
{{ put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536); }};
Run Code Online (Sandbox Code Playgroud)
现在我宣布MYHASH HashTable为最终版.如果我尝试添加更多元素,它接受.
MYHASH.put("NEW DATA", 256);
Run Code Online (Sandbox Code Playgroud)
现在,"NEW DATA"被添加到HashTable中.我的问题是为什么它允许添加甚至其声明为最终????