如何在任何给定时间点从给定字符串中查找前10个单词。python

如何在任何给定时间点从给定字符串中查找前10个单词。python,python,algorithm,data-structures,Python,Algorithm,Data Structures,假设我有一个字符串s,并且单词在任何给定的时间点都会不断添加到字符串中。现在,我必须在任何给定的时间点保持前10个重复出现的单词 我的方法是创建一个具有键值对的字典,如下所示 dic = {} for i in s: if i in dic: dic[i] +=1 else: dic[i] = 1 现在我想保持上述词典中前10个单词的频率。 我可以通过以下方式执行上述操作: 我可以在每次迭代后对字典进行排序,但它会导致很高的复杂性,因为字典可能包含数百万条记

假设我有一个字符串
s
,并且单词在任何给定的时间点都会不断添加到字符串中。现在,我必须在任何给定的时间点保持前10个重复出现的单词

我的方法是创建一个具有键值对的字典,如下所示

dic = {}
for i in s:
   if i in dic:
      dic[i] +=1
   else:
      dic[i] = 1
现在我想保持上述词典中前10个单词的频率。 我可以通过以下方式执行上述操作:

  • 我可以在每次迭代后对字典进行排序,但它会导致很高的复杂性,因为字典可能包含数百万条记录
  • 我可以使用计数器或集合功能,但我不想使用任何内置功能

  • 我想上面的程序在线性时间工作。我知道以前有人问过上述问题,但我无法找到线性解。

    您不必每次都对整个dict进行排序。只需检查递增的值现在是否大于现有的第十大值。

    这就是我如何实现我所要求的

    file = open('read.txt','r')
    text = file.read().split()
    word_cout = {}
    top_words = {}
    for i in text:
        if i in word_cout:
            word_cout[i] +=1
        else:
            word_cout[i] = 1
        if i not in top_words:
            for key in top_words.copy():
                if top_words[key] < word_cout[i]:
                    top_words.pop(key)
                    top_words[i] = word_cout[i]
                    break
        if(len(top_words) < 10):
            top_words[i] = word_cout[i]
    
    # print(word_cout)
    print((top_words))
    
    file=open('read.txt','r')
    text=file.read().split()
    单词cout={}
    top_单词={}
    对于文本中的i:
    如果我在word中无法:
    单词_cout[i]+=1
    其他:
    单词cout[i]=1
    如果我不是用最上面的话:
    输入最上面的单词。复制():
    如果上面的单词[关键字]
    如果第十大值增加了怎么办?您需要检查它的顶部。如果递增的值已经在前10名中,则无需更改,因为它仍然在前10名中。即使你想在前10名中排序,每次都是O(1),因为你只排序前10名,而不是其余的,所以总体上是O(N)。是的,但它可能会变成#9,所以你需要交换#9和#10。同意,我的问题仍然是O(1)@JohnZwinck,如何保持前10名的排序。我可以保持第十名的位置,但如何保持?你能用代码解释一下吗,因为这就是我要找的。@NikhilGupta:把它们分类就行了。对10个数字进行排序是O(1)。我不知道你所说的“如何”是什么意思。你可以用冒泡排序作为例子。