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

时间:2015-03-03 02:24:19

标签: 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秒内。我一直在读这篇文章,但是我无法确定我是否错过了这个或为什么它运行得更慢。

就家庭作业而言,这已经完成但我想了解我在这里失踪的原因或原因。

1 个答案:

答案 0 :(得分:2)

这里有很多因素:

  • 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将具有O(len(s))数字。
  • n很小,因此实施细节比复杂性更重要。
  • sorted内置并以C语言编写。实施已经过多年调整。你的素数乘法代码是用Python编写的。
  • 你不能在你的问题中说出你是如何进行计时的。例如,通过对整个程序进行计时而不是微基准计算,很容易弄错。鉴于结果的接近程度,我预计你会犯这样的错误,但这是一个猜测。