Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的字谜搜索算法比较[教程作业]_Python_Algorithm_Hash_Primes - Fatal编程技术网

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 = (""

我使用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秒的速度运行。我一直在阅读这篇文章,但我无法确定我是否错过了这篇文章的任何内容,也无法确定它为什么运行得较慢


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

这里有一大堆因素:

  • sorted
    是O(n log n)的平均情况,而不是O(n^2)。这种最坏的情况在实际的程序中几乎是不相关的
  • 将素数相乘是一个聪明的技巧,但尽管乘法的代价是O(n),但将一个大数字n乘以一个小因子的代价将是O(logn),而不是O(1)(因为必须遍历bignum的O(logn)位)。这意味着基本技术也将是O(n logn),因为keyHash将有O(len(s))位
  • n
    很小,所以实现细节将比复杂性更重要
  • sorted
    是内置的,用C编写。多年来,该实现一直在优化。您的素数乘法代码是用Python编写的
  • 在你的问题中,你没有说你是如何进行计时的。这很容易出错,例如,通过对整个程序进行计时,而不是进行微观基准测试。考虑到结果的接近性,我认为你犯了这样的错误,但这只是猜测

非常感谢。我真的很感谢你的反馈。我和朋友们讨论过这个问题,我们认为乘法是一个巨大的因素,但对于sorted()及其成本没有把握。我真的很想证实我的想法。回复:关于计时的反馈,我在中添加了额外的计时点。在创建散列并将其添加到字典中时计时,然后对结果求平均值以获得“每散列”:字符串散列-每主散列3.5微秒-每主散列4.5微秒