【问题标题】:Getting frequency count while inserting in linked list插入链表时获取频率计数
【发布时间】:2021-02-07 22:26:18
【问题描述】:

我为这种单链表实践创建了两个类。我想在将新添加的单词添加到列表时计算它们的频率。但似乎每次函数运行时它们的频率都只有 1? 练习还表明我应该在 Node 类中添加频率计数。

class Node:
    def __init__(self, wordData, freq=1):
        self.next = None
        self.wordData = wordData
        self.freq = freq

class FreqLinkedList:
    def __init__(self):
        self.head = None


    def addWord(self, word):
        #appending
        new_node = Node(word)
        if self.head is None:
            self.head = new_node
            return

        current_node = self.head
        while current_node.next:
            current_node = current_node.next
        current_node.next = new_node


        while current_node.next is not None:
            if current_node.wordData == word:
                current_node.freq += 1
                current_node = current_node.next
            current_node.next = current_node.next
        return current_node.freq

    def printList(self):
        current_node = self.head
        while current_node is not None:
            print(current_node.wordData, current_node.freq)
            current_node = current_node.next

【问题讨论】:

  • 似乎是糟糕的设计。 freq 不应该是 Node.js 的一部分。 IT 应该是FreqLinkedList 的一部分。因为如果您有数百万个单词条目,您最终会为了添加一个单词而迭代和更新所有条目。

标签: python python-3.x data-structures linked-list singly-linked-list


【解决方案1】:

这里的问题是您正在创建频率为 1 的每个节点。当您迭代链表以更新频率时,您只需将其增加 1。 因此最早的条目将具有正确的计数,而每个后续条目的计数将比前一个条目少一个。检查下面的sn-p:

f = FreqLinkedList()
f.addWord("a")
f.addWord("a")
f.addWord("a")
f.addWord("a")
f.printList()

# output
# a 4
# a 3
# a 2
# a 1

修复当前设计

在链表级别保持频率。并使用它来创建新节点并更新现有节点的频率。

from collections import Counter

class FreqLinkedList:
    def __init__(self):
        self.head = None
        self.freqs = Counter() # maintain freq of all words

    def addWord(self, word):

        # book keeping
        self.freqs.update([word]) # this will prevent splitting into characters
        current_word_freq = self.freqs.get(word)

        # appending
        if self.head is None:
            self.head = Node(word)
            return current_word_freq

        current_node = self.head
        while current_node.next:
            current_node = current_node.next
        current_node.next = Node(word, freq=current_word_freq) # freq != 1

        current_node = self.head
        while current_node.next is not None:
            if current_node.wordData == word:
                current_node.freq = current_word_freq # not freq += 1
            current_node = current_node.next
        return current_word_freq


# Test
f = FreqLinkedList()
f.addWord('a')
f.addWord('a')
f.addWord('a')
f.addWord('b')
f.addWord('b')
f.addWord('c')
f.addWord('d')
f.addWord('d')
f.printList()

# Output
# a 3
# a 3
# a 3
# b 2
# b 2
# c 1
# d 2
# d 2

但是,这种方法通常效率极低。

更好的设计

您不应该在Node 中有频率。在linkedlist中创建一个方法get_freq并像FreqLinkedList().get_freq('a')一样使用它:

def get_freq(self, word):
        return self.freqs.get(word)

【讨论】:

  • 嗨!非常感谢您的评论。虽然在练习中它明确要求我将频率添加到 Node 类,这就是我在那里添加它的原因。在链表级别进行簿记时,是否可以在节点级别保持频率?再次感谢。
  • 嗨!又是我。我尝试运行您的代码,但对于大多数单词的频率它返回 None ..
  • @mismes_f - 现在检查,我认为某处存在错误。我添加了工作正常的测试用例。请记住,您需要使用我的代码更新您的代码,才能使其特别适用于 addWord__init__
  • 非常感谢!现在它正在工作。但是,例如,当我尝试添加“会话”时,频率仍然为无。我认为它访问的是字母,而不是字符串。我尝试添加 self.freqs.update(current_node.wordData) 但它似乎不起作用。
  • 哇!确实我错过了!我修复了代码。 Counter('abc') -> {'a':1, 'b':1, 'c':1}。所以所需的更改是Counter(['abc']) -> {'abc':1}。感谢您了解。
猜你喜欢
  • 2022-10-14
  • 2018-03-22
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2023-03-09
  • 2012-06-20
相关资源
最近更新 更多