python - Python 中的 Anagram 搜索算法比较 [教程作业]

标签 python algorithm hash primes

我正在使用 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

对于 300k 单词,字符串哈希运行时间为 0.75 秒,素数哈希运行时间为 1 秒。我一直在阅读此内容,但我无法确定我是否错过了任何内容或它运行速度变慢的原因。

就家庭作业而言,这已经完成,但我想了解为什么或我在这里缺少什么。

最佳答案

这里发生了很多因素:

  • 排序平均情况为 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 编写的。
  • 您在问题中没有说明您是如何进行计时的。例如,通过对整个程序而不是微基准进行计时,很容易出错。考虑到结果的接近性,我希望您犯了这样的错误,但这只是猜测。

关于python - Python 中的 Anagram 搜索算法比较 [教程作业],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28823035/

相关文章:

python - 您可以在不保存到文件的情况下将视频转换为 python 中的音频文件吗?

python - 如何在 Python 字符串中替换括号和其中的文本

python - 在字典列表中组合相同键的值

c# - 使用数组进行独特行程选择的最佳性能算法?

hash - 如何处理哈希冲突?

c# - 如何在 C# 中使用 HashAlgorithm 散列两个数据 block ?

python - 如何重置 Spyder IDE (Python 2.7) 图形用户界面?

algorithm - 如何使用动态规划找到子序列的最大总和?

mysql - 如何通过网络对密码进行哈希和加密?

algorithm - QR 编码器/解码器支持 GS1?