<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>数据结构 on kutake小站</title><link>https://www.kutake.top/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link><description>Recent content in 数据结构 on kutake小站</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 27 Dec 2021 00:41:52 +0800</lastBuildDate><atom:link href="https://www.kutake.top/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>数据结构复习</title><link>https://www.kutake.top/archives/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%A4%8D%E4%B9%A0/</link><pubDate>Mon, 27 Dec 2021 00:41:50 +0800</pubDate><guid>https://www.kutake.top/archives/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%A4%8D%E4%B9%A0/</guid><description>&lt;!-- toc --&gt;
&lt;h2 id="1什么是算法"&gt;1.什么是算法？&lt;/h2&gt;
&lt;p&gt;算法是计算机科学中的基本概念，是对特定问题的求解步骤&lt;/p&gt;
&lt;h2 id="2什么是算法的复杂度"&gt;2.什么是算法的复杂度？&lt;/h2&gt;
&lt;p&gt;分为时间复杂度和空间复杂度，前者一般是指程序运行从开始到结束所需的时间，后者一般是指对应的程序从运行开始到结束所需的储存空间&lt;/p&gt;</description></item><item><title>哈夫曼编码的实现(python)</title><link>https://www.kutake.top/archives/%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0python/</link><pubDate>Sun, 21 Nov 2021 21:31:23 +0800</pubDate><guid>https://www.kutake.top/archives/%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81%E7%9A%84%E5%AE%9E%E7%8E%B0python/</guid><description>&lt;!-- toc --&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.kutake.top/media/2021/11/%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81%E5%AE%9E%E7%8E%B0%EF%BC%88python%EF%BC%89-1024x332.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;C++实在是弄不懂&lt;/del&gt;&lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from typing import List, Optional
class Node:
&amp;#34;&amp;#34;&amp;#34;
结点
&amp;#34;&amp;#34;&amp;#34;
def __init__(self):
self.name: Optional[str] = None
self.weight: Optional[int] = None
self.left_child: Optional[Node] = None
self.right_child: Optional[Node] = None
self.parent: Optional[Node] = None
class NodeCode:
&amp;#34;&amp;#34;&amp;#34;
结点的编码
&amp;#34;&amp;#34;&amp;#34;
def __init__(self, name: str, code: str):
self.name = name
self.code = code
def __str__(self):
return f&amp;#34;{self.name}:{self.code}&amp;#34;
class HaffumanTreeCode:
&amp;#34;&amp;#34;&amp;#34;
哈夫曼树的编码
&amp;#34;&amp;#34;&amp;#34;
def __init__(self):
self.code_list: List[NodeCode] = []
def append(self, code: NodeCode):
self.code_list.append(code)
def code(self, massage: str):
&amp;#34;&amp;#34;&amp;#34;
针对编码表编码
:param massage: 需要编码的信息
:return:
&amp;#34;&amp;#34;&amp;#34;
code = &amp;#34;&amp;#34;
for i in massage:
for n in self.code_list:
if n.name == i:
code += n.code
break
# raise ValueError(f&amp;#34;&amp;#39;{i}&amp;#39;不存在&amp;#34;)
return code
def decode(self, code: str):
&amp;#34;&amp;#34;&amp;#34;
针对编码表解码
:param code:需要解码的哈夫曼码
:return:
&amp;#34;&amp;#34;&amp;#34;
out = &amp;#34;&amp;#34;
i = 0
while code:
code_need_match = code[0:i+1]
for n in self.code_list:
if n.code == code_need_match:
out += n.name
code = code[i+1:]
i = 0
break
i += 1
return out
def __str__(self):
&amp;#34;&amp;#34;&amp;#34;
打印
:return:
&amp;#34;&amp;#34;&amp;#34;
out = &amp;#34;&amp;#34;
for i in self.code_list:
out += i.__str__() + &amp;#34;\n&amp;#34;
return out.strip()
class HaffumanTree:
&amp;#34;&amp;#34;&amp;#34;
哈夫曼树
&amp;#34;&amp;#34;&amp;#34;
def __init__(self):
self.root = Node()
self.nodes: List[Node] = []
self.nodes_raw: List[Node] = []
self.codes: HaffumanTreeCode = HaffumanTreeCode()
def inser(self, newnode: Node):
for i in range(len(self.nodes)):
if self.nodes[i].weight &amp;lt; newnode.weight:
self.nodes.insert(i, newnode)
return
self.nodes.append(newnode)
def build_tree(self, name_list: List[str], weight_list: List[int]):
&amp;#34;&amp;#34;&amp;#34;
创建哈夫曼树
:param name_list: 字符列表
:param weight_list: 权重列表
:return:
&amp;#34;&amp;#34;&amp;#34;
# 队每个字符生成结点
while len(name_list) &amp;gt; 0:
max_weight = max(weight_list)
max_index = weight_list.index(max_weight)
max_name = name_list[max_index]
newnode = Node()
newnode.name = max_name
newnode.weight = max_weight
self.nodes.append(newnode)
name_list.remove(max_name)
weight_list.remove(max_weight)
# 保存源结点
self.nodes_raw = self.nodes[:]
# 创建新结点并生成树
while len(self.nodes) &amp;gt; 2:
left = self.nodes.pop()
right = self.nodes.pop()
newnode = Node()
newnode.weight = left.weight + right.weight
newnode.left_child = left
newnode.right_child = right
left.parent = newnode
right.parent = newnode
# 根据权重插入
self.inser(newnode)
left = self.nodes.pop()
right = self.nodes.pop()
self.root.weight = left.weight + right.weight
self.root.left_child = left
self.root.right_child = right
left.parent = self.root
right.parent = self.root
def make_code(self):
&amp;#34;&amp;#34;&amp;#34;
生成编码表
:return:
&amp;#34;&amp;#34;&amp;#34;
while len(self.nodes_raw):
node = self.nodes_raw.pop()
name = node.name
code = &amp;#34;&amp;#34;
while node.parent != self.root:
parent = node.parent
if parent.left_child == node:
code = &amp;#34;0&amp;#34; + code
elif parent.right_child == node:
code = &amp;#34;1&amp;#34; + code
node = parent
if self.root.left_child == node:
code = &amp;#34;0&amp;#34; + code
elif self.root.right_child == node:
code = &amp;#34;1&amp;#34; + code
self.codes.append(NodeCode(name, code))
def decode(self, code: str):
return self.codes.decode(code)
def code(self, massage: str):
return self.codes.code(massage)
if __name__ == &amp;#39;__main__&amp;#39;:
h = HaffumanTree()
name_list = [&amp;#34;a&amp;#34;, &amp;#34;b&amp;#34;, &amp;#34;c&amp;#34;, &amp;#34;d&amp;#34;, &amp;#34;e&amp;#34;]
wight_list = [5, 11, 6, 21, 19]
h.build_tree(name_list, wight_list)
h.make_code()
print(f&amp;#34;编码表：\n{h.codes}&amp;#34;)
print(f&amp;#39;bcacce编码为：{h.code(&amp;#34;bcacce&amp;#34;)}&amp;#39;)
print(f&amp;#39;01001000001001解码为： {h.decode(&amp;#34;0100100000100110&amp;#34;)}&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>