反正是有创造一个哈希值进行排序字符串hashs,并有相同的结果,如果字符串本身进行排序?
这将是不可能的,至少如果你允许字符串长度超过散列尺寸长。你有256 ^(最大字符串大小)映射到256 ^(散列大小)的哈希值可能的字符串,所以你会与一些排序,则字符串的结束。
试想一下,最简单的哈希:截断每个字符串(散列大小)字节。
是。它使用整个输入字符串作为哈希调用。
正如其他人指出,这是不实际的,你问过什么。你不得不使用字符串本身作为将限制可能被“散列”等字符串长度的哈希值。
至维持“排序的散列”的数据结构的明显的方法是保持两个已排序的列表(堆或二叉树,例如)和数据的哈希映射。插入和清除会是O(的log(n)),而检索将是O(1)。副手我不知道多久,这将是值得的额外的复杂性和开销。
如果你有一个特别大的数据集,大多是只读的,这样对数时间检索过于昂贵的话,我想这可能是有用的。需要注意的是更新的成本实际上是恒定的时间(散)和对数时间(二叉树或堆)行动的总和。然而O(1)+ O(的log(n))减小到两个术语中的渐近分析期间越大。 (底层成本仍然存在---相关的任何执行工作,无论其理论无关的)。
对于显著范围数据集的大小保持这个假设的混合数据结构的成本可以被估计为“两次”维持任一纯的人的成本。 (换句话说二叉树的许多实现在可扩展到数十亿美元的时间成本要素(2 ^〜32左右)的那是相当典型的散列函数的成本)。所以我会捉襟见肘说服自己,这样添加的代码的复杂性和运行时间成本(混合数据结构),实际上是有利于给定的项目。
(注:我看到了Python 3.1.1添加的“有序”字典......的概念,这类似于进行排序,但并不完全一样从我所收集的有序字典保存在哪些元素插入的顺序。到集合中。我还依稀记得的“意见” ......在可以访问一些特定的方式字典的键的语言对象的一些谈话(整理,反转,反向排序,...)在(可能)降低成本不是通过一组密钥,通过内置的“排序()”和“逆转()。”我没有用过这些,也有看着的实施细节。我猜想,这些“意见”一将是这样的一个懒惰地评估指数,在执行呼叫所需的排序,并存储与某种当后端源集合被更新的复位标志或触发(观察者模式或收听)的结果。在该方案中的给呼叫该“意见”将更新其索引;子通话将能够使用这些结果使只要没有插入缺失也已作出了解释。对关键的变化随后视图的任何电话会招致更新视图的成本。然而,这并不是我的所有纯属猜测。我提到它,因为它也可能提供洞察到一些替代办法来处理这个问题)。
不,除非有字符串长度超过散列少,而散列perfect。即使如此,你仍然必须确保哈希顺序是一样的字符串命令,除非你事先知道所有的字符串这可能是不可能的。
号散列将必须包含的,因为它是替换的字符串相同的信息量。否则,如果两个字符串映射到相同的哈希值,你怎么可能对它们进行排序?
思考它的另一种方式是这样的:如果我有两个字符串,“A”和“B”,然后我凑两者有这种保护的散列函数,并得到F(A)和f(b)所示。然而,也有比“一”但小于“B”大弦无限多的。这将需要散列字符串任意精度实值(因为基数)。最后,你会基本上只具有编码为数字的字符串。
你基本上询问是否可以压缩的关键字符串成较小的按键,同时保留其排序顺序。所以,这取决于你的数据。如果你的字符串组成的唯一的十六进制数字,例如,它们可以用4位代码代替。
但一般情况下,它无法做到的。你会落得“散列”每个源钥匙插进本身。