数据结构和算法 笔记2
转载
完全树:
如果节点在列表中的位置为 p,那么其左子节点的位置为 2p,类似的,其
右子节点的位置为 2p+1
堆次序:是指堆中任意一个节点 x,其父节点 p 中的 key 均小于或等于 x 中的 key。
===============《用python解决数据结构和算法》https://facert.gitbooks.io/python-data-structure-cn/
递归(任意进制的转换)
def to_string(num, base):
cover2str ='0123456789ABCDEF'
if num < base:
return cover2str[num]
else:
return to_string(num//base, base) + cover2str[num%base]
真正的动态规划会采用更系统化的方法来解决问题。
动态规划的解决方法是从为1分钱找零的最优解开始,逐步递加上去,直到我们需要的找零钱数。
这就保证了在算法的每一步过程中,我们已经知道了兑换任何更小数值的零钱时所需的硬币数量的最小值
找零同时记录使用的硬币:
===============
=================
是否连通
class NODE(object):
def __init__(self,value):
self.value=value
self.childs=[]
def add_child(self,data):
self.childs.append(data) # 子节点其实也是NODE类型,即子节点和自己是一个类型
def __str__(self):
return str(self.value)
class VECTOR(object):
def __init__(self):
self.sons={}
self.ret=[]
def add_son(self,lst):
for k,v in lst:
if k not in self.sons:
self.sons[k]=NODE(k)
if v not in self.sons:
self.sons[v]=NODE(v)
self.sons[k].add_child(self.sons[v]) #关键点,k的子节点v就是sons里的那个v,要是一个v !!!
def judge(self,x_node,y):
if x_node.value == y:
self.ret.append(x_node)
return True
for i in x_node.childs:
k_node = self.sons.get(i.value,None)
if not k_node:
continue
if self.judge(i,y):
self.ret.append(x_node) #我的孩子和y是联通的,也就代表我也是和y联通的,所以要把我也加到结果集里去
return True
else:
return False
def weather_in(self,x,y):
x_node = self.sons.get(x,None)
if not x_node:
return False
return self.judge(x_node,y)
def show(self):
ret=reversed(self.ret) #要倒序一下
for i in ret:
print(i)
sl=VECTOR()
lst=[('a','b'),('b','z'),('c','d'),('b','c')]
sl.add_son(lst)
ret=sl.weather_in('a','c')
print(ret)
sl.show()
广度优先搜索算法一个好方法是想象它正在建一棵树,一次建一层。广度优先搜索先从其起始顶点开始添加它的所有子节点,然后再添加其子节点的子节点
广度优先可用来计算起始字转换为结束字所需的最小转换次数【词梯问题(不需要给dis初值是None,weight=1)】,
通过颜色判断就能防止死循环,适合大家权重都相同的情况;若权重不相同,需要用最短路径方法
最短距离算法用到了优先级队列,提供从一个起点到图中其他节点的最短路径。权重必须是整数,否则永远无法退出循环
水电费
=====
深度优先搜索通过尽可能深地探索树的一个分支来创建搜索树
=========
最小权重生成树: