考虑到该问题的琐碎实现,我正在寻找一种更快的方法来查找Python列表中最常见的单词。作为Python采访的一部分,我收到了反馈,认为这种实现效率很低,基本上是失败的。后来,我尝试了许多发现的算法,只有一些基于堆搜索的解决方案要快一些,但并没有压倒性的优势(当扩展到成千上万个项目时,堆搜索的速度要快30%左右;在千篇一律的长度上,几乎是相同;使用timeit)。

def stupid(words):
    freqs = {}
    for w in words:
        freqs[w] = freqs.get(w, 0) + 1
    return max(freqs, key=freqs.get)

因为这是一个简单的问题,而且我有一些经验(尽管我不在算法大师或竞争性编码器的任何地方),但我感到很惊讶。

当然,我想提高自己的技能,并了解解决问题的更好方法,因此,您的意见将不胜感激。

澄清重复状态:我的观点是找出是否确实存在(渐近地)更好的解决方案,而其他类似问题选择的答案也并不好。如果这不足以使问题变得唯一,请当然关闭此问题。

更新

谢谢大家的投入。关于面试的情况,我的印象仍然是期望使用手写搜索算法(这可能会更有效),并且/或者审阅者正在从另一种语言的角度评估具有不同常数因子的代码。当然,每个人都可以有自己的标准。

对我而言,重要的是验证我是否一无所知(我觉得自己不是一个笨手笨脚),或者通常只是编写不出最好的代码。仍然有可能存在更好的算法,但是如果它对这里的社区隐藏了几天,我对此表示满意。

我正在选择最受好评的答案-这样做似乎很公平,即使有不止一个人提供了有用的反馈意见。

次要更新

似乎使用defaultdict相比使用'get'方法具有明显的优势,即使它是静态别名也是如此。

最佳答案

这听起来像是一个不好的面试问题,可能是面试官期望得到一定答案的情况。听起来他/他没有清楚解释他/她在问什么。

您的解决方案是O(n)(其中n = len(words)),并且使用堆不会改变它。

有更快的近似解决方案...

关于python - 有没有一种更好的方法来查找列表中最常见的单词(仅适用于Python),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31288030/

10-12 17:00