插入链表时获取频率计数
Getting frequency count while inserting in linked list
为了这个单链表的实践,我创建了两个classes。我想在将新添加的单词添加到列表时计算它们的频率。但似乎每次函数运行时,它们的频率都只有 1?
练习还指出我应该在节点 class.
中添加频率计数
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
这里的问题是您正在创建频率为 1 的每个节点。当您遍历链表以更新频率时,您只需将它递增 1。
因此,最早的条目将具有正确的计数,而每个后续条目的计数将比前一个条目少 1。检查以下代码段:
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
中有频率。在链表中创建一个方法 get_freq
并像 FreqLinkedList().get_freq('a')
一样使用它:
def get_freq(self, word):
return self.freqs.get(word)
为了这个单链表的实践,我创建了两个classes。我想在将新添加的单词添加到列表时计算它们的频率。但似乎每次函数运行时,它们的频率都只有 1? 练习还指出我应该在节点 class.
中添加频率计数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
这里的问题是您正在创建频率为 1 的每个节点。当您遍历链表以更新频率时,您只需将它递增 1。 因此,最早的条目将具有正确的计数,而每个后续条目的计数将比前一个条目少 1。检查以下代码段:
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
中有频率。在链表中创建一个方法 get_freq
并像 FreqLinkedList().get_freq('a')
一样使用它:
def get_freq(self, word):
return self.freqs.get(word)