随笔分类 - 数据结构与算法分析(课堂笔记)
学习数据结构与算法分析过程中的一些笔记与思考
摘要:在网上找了一下,跑了一下代码,发现竟然是错的。无奈,还是自己写吧。 核心代码: def buildTree(data: List[int]): count = 0 q = Queue() root = TreeNode(data[0]) q.put(root) curNode = None for
阅读全文
摘要:图片来自《我的第一本算法书》(书中 Dijkstra 译作狄克斯特拉) 1、Dijkstra 算法的演示 我们设 A 为起点,G 为终点。演示用的图是无向带权图。 然后设置各个顶点的初始权重:起点为 0,其他顶点为无穷大(∞)。(注:这里的每个点的权重,即从 A 点到该点的最短距离) 下面的颜色中,
阅读全文
摘要:题目描述 圆上有 2n 个不同的点, 两点之间连成直线段, 要求这些线段不能共点. 计算出有 12 个点时共有多少种不同的连线方式. 设计 C 语言函数, int count (int n), 计算并返回圆上有 2n 个点时的连线方式数量. 分析 我们可以使用动态规划的思想来求解这道题. 设 2n
阅读全文
摘要:堆排序是选择排序的一种, 所以, 下面的代码包含了最简单的选择排序. #include <stdio.h> typedef int ElementType; // 交换元素 void Swap(ElementType *a, ElementType *b) { ElementType t = *a;
阅读全文
摘要:代码: #include <stdio.h> #include <stdlib.h> // 假设元素最多有 MaxDigit 个关键字, 基数全是同样的 Radix #define MaxDigit 4 #define Radix 10 typedef int ElementType; // 桶元素
阅读全文
摘要:根据上图, 构造出来的最小生成树的权值和应为 16. 主要部分代码: /** * 将最小生成树保存为邻接表存储的图 MST, 返回最小权重和 * @param Graph * @param MST 即 Minimun-cost Spanning Tree 最下生成树 * @return */ int
阅读全文
摘要:代码: void BFS(MGraph Graph, Vertex S, void(* Visit)(Vertex)) { Queue Q; Vertex V, W; Q = CreateQueue(MaxSize); // 创建空队列 // 访问顶点, 此处可以根据需要改写 Visit 函数 Vi
阅读全文
摘要:queue.h #include <stdbool.h> #ifndef MGRAPH_QUEUE_H #define MGRAPH_QUEUE_H typedef int ElementType; typedef int Position; typedef struct QNode * PtrTo
阅读全文
摘要:代码: void Visit(Vertex V) { printf("正在访问顶点%d\n", V); } // Visited[] 为全局变量, 已经初始化为 false // 以 V 为出发点对邻接表存储的图 Graph 进行 DFS 搜索 void DFS(LGraph Graph, Vert
阅读全文
摘要:代码: #include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 // 最大顶点数设为 100 typedef int Vertex; // 用顶点下标表示顶点, 为整型 typedef int WeightType; // 边的
阅读全文
摘要:代码: #include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 // 最大顶点数设为 100 #define INFINITY 65535 // 无穷大设为双字节无符号整数的最大值 65535 typedef int Verte
阅读全文
摘要:题目描述 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图1 --> 图2 --> 现给定两棵树,请你判断它们是否是同构的。
阅读全文
摘要:问题描述 一个圆上有 3n 个点, 一共有多少种不同方式将这些点连接成 n 个没有共同顶点且不相交的三角形? n = 5 时的结果是多少? 分析 这个问题的解法就是分治加递归. 如下图所示: 以中间的蓝色的三角形的三条边为分割线, 我们可以把圆看成三个部分, 我们只分别求出三个部分的各自的不同的三角
阅读全文
摘要:动态规划 Dynamic Programming 理查德·贝尔曼(Richard Bellman)在1957年提出了动态规划(Dynamic Programming, 即 DP)一词 通过将解决方案与包含一般子问题的子问题组合来解决问题 DP 与 分治之间的不同点: 使用分而治之解决这些问题的效率很
阅读全文
摘要:binheap.h typedef int ElementType; /* START: fig6_4.txt */ #ifndef _BinHeap_H #define _BinHeap_H struct HeapStruct; typedef struct HeapStruct *Priorit
阅读全文
摘要:public boolean hasCycle(ListNode head) { if (head == null) return false; //快慢两个指针 ListNode slow = head; ListNode fast = head; while (fast != null && f
阅读全文
摘要:一、实验描述 给出一棵二叉树的先序(或后序)遍历结果,以及中序遍历结果,如何构造这棵树?假定遍历结果以数组方式输入,请写出相应函数,判断是否存在生成同样遍历结果的树,如果存在,构造这棵树。 二叉树的层序遍历。使用队列作为辅助存储,按树的结点的深度,从根开始依次访问所有结点。 二、问题分析与算法设计
阅读全文
摘要:一、实验描述 Radix Sort。实现桶式排序和基于桶式排序的基数排序。在基数 B 中,数组长度 n 和 最大元素 m 中,对排序时间影响最大的是哪一个?元素在未排序数组中的顺序是否对时间复杂度有影响?设计实验证明你的想法。 Stack。用 C 语言设计堆栈,并实现中缀表达式到后缀表达式的转换。
阅读全文
摘要:一、约瑟夫问题的求解 1、问题描述 N people form a circle, eliminate a person every k people, who is the final survivor? 本次实验内容是用游标方式的循环链表实现对此约瑟夫问题的求解。 2、问题分析与算法设计 将人的
阅读全文
摘要:一、求整数幂问题 1.问题描述 用基于2和3的方式分别写出算法来求 power(n, x)。分析两种算法的复杂程度,设计试验来验证你的想法。 2、问题分析与算法设计 问题: 如何使用较少的乘法次数求 \(x^{27}\)? 方法:缓存中间结果,避免重复计算 过程演示: \(x^3 = x * x *
阅读全文