Python [教程作业] 中的 Anagram 搜索算法比较
Anagram Search Algorithm Comparison in Python [Tutorial Homework]
我正在使用 defaultdict 在 Python 中做一个简单的算法排序,创建一个散列用作键,然后只遍历字典并打印出任何超过一个值的东西。
最初是通过使用以下方法创建排序字符串来创建哈希:
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
在 30 万个单词上,字符串哈希在 0.75 秒内运行,素数哈希在 1 秒内运行。我一直在阅读这篇文章,但我无法确定我是否遗漏了任何内容,或者为什么它 运行 变慢了。
就家庭作业而言,这已经完成,但我想了解我在这里遗漏的原因或内容。
这里有很多因素:
sorted
是 O(n log n) 平均情况而不是 O(n^2)。排序的最坏情况几乎与实际程序无关。
- 将素数相乘是一个聪明的技巧,但是虽然它的乘法成本为 O(n),但将一个大数 N 乘以一个小因数的成本将是 O(log N) 而不是 O(1) (因为你必须通过 bignum 的 O(log N) 位)。这意味着主要技术也将是 O(n log n),因为 keyHash(s) 将具有 O(len(s)) 数字。
n
很小,因此实现细节比复杂性更重要。
sorted
是内置的,用 C 编写的。实施已经调整了很多年。你的质数乘法代码写在Python.
- 你没有在你的问题中说明你是如何进行计时的。这很容易出错,例如,对整个程序而不是微基准进行计时。考虑到结果的接近程度,我认为你犯了这样的错误,但这是一个猜测。
我正在使用 defaultdict 在 Python 中做一个简单的算法排序,创建一个散列用作键,然后只遍历字典并打印出任何超过一个值的东西。
最初是通过使用以下方法创建排序字符串来创建哈希:
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
在 30 万个单词上,字符串哈希在 0.75 秒内运行,素数哈希在 1 秒内运行。我一直在阅读这篇文章,但我无法确定我是否遗漏了任何内容,或者为什么它 运行 变慢了。
就家庭作业而言,这已经完成,但我想了解我在这里遗漏的原因或内容。
这里有很多因素:
sorted
是 O(n log n) 平均情况而不是 O(n^2)。排序的最坏情况几乎与实际程序无关。- 将素数相乘是一个聪明的技巧,但是虽然它的乘法成本为 O(n),但将一个大数 N 乘以一个小因数的成本将是 O(log N) 而不是 O(1) (因为你必须通过 bignum 的 O(log N) 位)。这意味着主要技术也将是 O(n log n),因为 keyHash(s) 将具有 O(len(s)) 数字。
n
很小,因此实现细节比复杂性更重要。sorted
是内置的,用 C 编写的。实施已经调整了很多年。你的质数乘法代码写在Python.- 你没有在你的问题中说明你是如何进行计时的。这很容易出错,例如,对整个程序而不是微基准进行计时。考虑到结果的接近程度,我认为你犯了这样的错误,但这是一个猜测。