
数据结构与算法
文章平均质量分 73
章小幽
这个作者很懒,什么都没留下…
展开
-
算法作业-整数划分-递归
正整数的划分问题是将一个正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。请编写至少三种不同的求解算法,并对所编写算法的时间效率进行测试和比较。解法一:递归算法考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m),可以建立q(n,m)的如下递归关系:1,q(n,1) = 1, n≥1; 当最大加数n1不大于1时,任何正整数n只有一种划分...原创 2018-06-01 17:44:39 · 5488 阅读 · 2 评论 -
排序——归并排序 Python3版本
参考博客:https://www.cnblogs.com/piperck/p/6030122.html原博客的归并排序稳定性好像有点问题,我的代码如下:# 合并两个有序数组def merge(a,b): c = [] i,j = 0,0 while i < len(a) and j < len(b): if a[i] > b[...原创 2019-05-05 11:29:14 · 442 阅读 · 0 评论 -
数据结构——树
# list of lists# 在这种定义的情况下,根节点为t[0],左节点t[1],右节点为t[2]def binary_tree(r): return [r,[],[]]def insert_left(root,new_branch): t = root.pop(1) #左孩子 if len(t) > 0: # 如果左孩子不为空,将其作为新分支的左孩...原创 2018-07-19 20:44:24 · 166 阅读 · 0 评论 -
数据结构——堆
# 基于二叉堆的优先队列# 二叉堆的属性:每个节点的父节点都比它本身要小class BinHeap: def __init__(self): self.heap_list = [0] self.current_size = 0插入操作: def perc_up(self,i): while(i//2 > 0):...原创 2018-07-19 20:43:35 · 166 阅读 · 0 评论 -
数据结构——链表
# 链表的基本组成就是一个个Node,每个Node都包括两部分内容,一部分是自身的data,另一部分是下一个Node的索引# 每一个链表都有一个Head节点和一个End节点,End节点的next为Noneclass Node: def __init__(self,init_data): self.data = init_data self.next =...原创 2018-07-19 20:42:08 · 137 阅读 · 0 评论 -
数据结构——队列
class Queue: def __init__(self): self.items = [] def is_empty(self): return self.items == [] # input在前,output在后 def enqueue(self,item): self.items.insert(0,...原创 2018-07-19 20:38:40 · 139 阅读 · 0 评论 -
数据结构——栈
class Stack1: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def push(self,item): self.items.append(item) def pop(self): ...原创 2018-07-19 20:37:47 · 622 阅读 · 0 评论 -
算法作业-凸包问题-Graham方法
给定平面上n(n≥3)个点的集合P,求P的一个最小子集Q,使得Q中的点能构成的一个包围P中所有点的多边形。请设计一种贪心算法求解此问题,并证明你所设计的贪心策略的正确性,分析算法的时间复杂度。解:Graham算法基本思路:1,选择P中y坐标最小的点为起始点p0,若有多个这样的点则进一步选取其中x坐标最小的点为p0;2,设<p1,p2,……,pm>是P中剩余的点,对其按逆时针方向相对p0...原创 2018-06-04 20:34:26 · 2508 阅读 · 1 评论 -
算法作业-Ackermann函数-动态规划方法
Ackermann函数定义如下:1,请采用备忘录方法设计一个求解该函数的递归算法。2,请用动态规划方法设计一个非递归求解算法,该算法由两个嵌套循环组成,只能使用O(m)内的空间。解法一:备忘录方法解法二:动态规划方法用两个一维数组ind[i]和val[i],使得当ind[i]等于t时,val[i] = A(i, ind[i])。初始时,令ind[0] = 0,val[0] = 1,ind[i] =...原创 2018-06-03 15:05:51 · 6761 阅读 · 2 评论 -
算法作业-Ackermann函数-备忘录方法
Ackermann函数定义如下:1,请采用备忘录方法设计一个求解该函数的递归算法。2,请用动态规划方法设计一个非递归求解算法,该算法由两个嵌套循环组成,只能使用O(m)内的空间。解法一:备忘录方法使用一个二维数组A[m][n]记录所有的Ackermann函数值,初始的时候全部填充0,表示尚未计算过,然后直接用递归函数计算Ackermann函数。在递归计算之前,先判断数组A中该函数值是否已被计算过,...原创 2018-06-03 14:51:58 · 2458 阅读 · 0 评论 -
算法作业-整数划分-母函数
正整数的划分问题是将一个正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。请编写至少三种不同的求解算法,并对所编写算法的时间效率进行测试和比较。解法一:递归算法解法二:动态规划算法解法三:母函数算法,xmk表示划分中包含了m个k的情况。正整数n的不同划分个数的母函数为:利用函数G(x)求出xn的系数即可。算法如下:Java代码如下:package in...原创 2018-06-02 16:20:52 · 729 阅读 · 0 评论 -
算法作业-整数划分-动态规划
正整数的划分问题是将一个正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。请编写至少三种不同的求解算法,并对所编写算法的时间效率进行测试和比较。解法一:递归算法解法二:动态规划算法算法如下:Java代码如下:package integer_division;public class Integer_division_2 { public sta...原创 2018-06-02 12:58:32 · 1204 阅读 · 2 评论 -
算法作业-集合划分-回溯法
给定一个整数集合S,求集合S的一个划分S1和S2(即:S=S1∪S2且S1∩S2=Φ),使得S1中的元素之和等于S2中的元素之和。1),证明此问题是NP难的。2),设计一个搜索算法(回溯法或分支界限法)求解此问题。解:1)证明:由题目可知,只需要证明该集合划分问题是NP完全问题即可。为了证明任意一个问题A是NP完全问题,需要做到下面四个步骤。1,存在一个非确定性多项式时间算法能解决A,例如A∈NP...原创 2018-06-04 20:56:31 · 1394 阅读 · 1 评论 -
排序——快速排序 Python3版本
参考资料:https://www.jianshu.com/p/2b2f1f79984e参考资料里的伪快排代码错误,我对其进行了更改。Python3代码如下:# 先来一个伪快排def quick_sort1(nums): if len(nums) <= 1: return nums else: pivot = nums[0] ...原创 2019-05-05 16:25:03 · 284 阅读 · 0 评论