Python中的字谜搜索算法比较[教程作业]
我使用defaultdict在Python中做了一个简单的算法排序,创建一个散列作为键,然后只是在字典中查找,然后打印出任何超过一个值的内容 最初,通过使用以下命令创建排序字符串来创建哈希:Python中的字谜搜索算法比较[教程作业],python,algorithm,hash,primes,Python,Algorithm,Hash,Primes,我使用defaultdict在Python中做了一个简单的算法排序,创建一个散列作为键,然后只是在字典中查找,然后打印出任何超过一个值的内容 最初,通过使用以下命令创建排序字符串来创建哈希: def createHashFromFile(fileName): with open(fileName) as fileObj: for line in fileObj: line = line.lower() aHash = (""
def createHashFromFile(fileName):
with open(fileName) as fileObj:
for line in fileObj:
line = line.lower()
aHash = ("").join(sorted(line.strip()))
aSorter[aHash].append(line.strip())
但是,由于sorted()函数是O(n^2),因此建议通过素因子分解创建散列。我创建了一个字典,将所有小写字母映射到素数,然后执行以下操作:
def keyHash(word):
mulValue = 1
for letter in word:
letter = letter.lower()
mulValue = mulValue * primeDict[letter]
return mulValue
在300k字上,字符串哈希以0.75秒的速度运行,基本哈希以1秒的速度运行。我一直在阅读这篇文章,但我无法确定我是否错过了这篇文章的任何内容,也无法确定它为什么运行得较慢
就家庭作业而言,这已经完成了,但我想了解为什么或我在这里遗漏了什么。这里有一大堆因素:
是O(n log n)的平均情况,而不是O(n^2)。这种最坏的情况在实际的程序中几乎是不相关的sorted
- 将素数相乘是一个聪明的技巧,但尽管乘法的代价是O(n),但将一个大数字n乘以一个小因子的代价将是O(logn),而不是O(1)(因为必须遍历bignum的O(logn)位)。这意味着基本技术也将是O(n logn),因为keyHash将有O(len(s))位
很小,所以实现细节将比复杂性更重要n
是内置的,用C编写。多年来,该实现一直在优化。您的素数乘法代码是用Python编写的sorted
- 在你的问题中,你没有说你是如何进行计时的。这很容易出错,例如,通过对整个程序进行计时,而不是进行微观基准测试。考虑到结果的接近性,我认为你犯了这样的错误,但这只是猜测