随笔分类 - DataStructure
摘要:数据结构模板 Chen 2016/12/22 Open Source in Github: https://github.com/Wasdns/DataStructure Templates 前言 本篇博客的模板,全部是我纯手打的,如果有发现错误,请在下方留言指正:)。欢迎大家参考。 有一些地方还不
阅读全文
摘要:本篇博客实现了 1.冒泡排序 2.冒泡排序的一种优化(当某次冒泡没有进行交换时,退出循环) 3.选择排序 4.归并排序 5.快速排序。 主要是源码的实现,并将自己在敲的过程中所遇到的一些问题记录下来。 全局定义与相关声明: 冒泡的思想:不断把范围中的最大数往后排,排完之后缩小范围;以上过程执行n次。
阅读全文
摘要:题目和STL实现: "DS实验题 融合软泥怪 1" 用堆实现优先队列 引言和堆的介绍摘自: "Priority Queue(Heaps) 优先队列(堆)" 引言: 优先队列是一个至少能够提供插入(Insert)和删除最小(DeleteMin)这两种操作的数据结构。对应于队列的操作,Insert相当于
阅读全文
摘要:题目 思路 很容易想到第一种做法,用Huffman算法,从森林中找出两个值最小的节点,合并再加入森林,在这个过程中不断记录。 但是每一次需要sort一遍,将最小的两个值节点置于头两个节点,最坏情况下复杂度是O(n^3)的量级,结果是TLE。 第二种方法是利用STL中的priority_queue模板
阅读全文
摘要:题目: 思路: 有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考: "最小生成树 Prim算法和Kruskal算法" ,讲的已经是十分清楚了。 具体算法实现: 1.首先用结构体数组存储输入的边,并且初始化一个并查集思想中的父亲数组fa[i];
阅读全文
摘要:注意点: 和上一篇的 "DS Tree 已知先序、中序 = 建树 = 求后序" 差不多,注意的地方是在aftorder中找根节点的时候,是从右往左找,因此递归的时候注意参数,最好是拿纸和笔模拟一遍。 代码(主体部分): 2016/12/21
阅读全文
摘要:参考: "二叉树——前序和中序得到后序" 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置。大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在midorder中找到根节点的位置index,中序序列在index左边的部分就是root的左子树,在
阅读全文
摘要:题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿子。 用for遍历一遍所有的节点,让每一个节点都连接到它的父亲,最后从根节点开始访问即可。 代码:
阅读全文
摘要:自己写的一个无向图邻接表,edge代表邻接的节点,head代表邻接表主体节点。 不是很喜欢用数组建表,主要是因为数组建表虽然实现简单,但是理解略显复杂,这个方面可以参考朝夕的博客。 2016/12/18
阅读全文
摘要:题目见前文: "DS实验题 Old_Driver UnionFindSet结构" 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: 2016/12/18
阅读全文
摘要:题目 思路 很典型的并查集问题,朋友A和B要合并到一个统一的集合中,也就是Union(A, B)操作,在Union操作中需要先找到A所属的集合的代表元和B所属集合的代表元,也就是使用Find(A)和Find(B),如果它们的代表元不一样,则将B集合合并到A集合(pre[B_root] = A_roo
阅读全文
摘要:题目: 思路: 如果直接暴力搜索的话,时间复杂度为O(n m),在n为百万量级的情况下,必然是T。 所以,这里通过hash函数,将字符串转换为对应的hash值;同时利用邻接表避免了hash冲突,方法是用head[hashval]存储指向一个相同hash值的单链表的指针(这里指的是相当于一个头指针),
阅读全文
摘要:题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的。基本全WA(摊手)。 贴上第一次的代码: 结果是部分点TLE: 分析下算法复杂度:选择最后一次的Union操作,最坏情况下一共有50000个节点,从l到mid是25000个排好序的元素,从mid开始到r有250
阅读全文
摘要:题目: "hdoj 1233" 题解: 本题是典型的最小生成树问题,给出的是无向图,这里使用的方法是Prim最小生成树算法。 Reference Prim算法参照: "最小生成树 Prim算法和Kruskal算法" ,讲的很详细了。 测试的时候可以参考这幅图: 算法介绍: 主要步骤(摘自上文链接):
阅读全文
摘要:题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19. // Copyright ? 2016年 wasdns. All rights reserved
阅读全文
摘要:题目: 提示:并没有精度问题。 原题 "NOIP2010 导弹拦截" 思路 设源点为A(x1, y1)和B(x2, y2)。 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和A的距离平方len1:len1 = (x x1) (x x1) + (y y1) (y y1)
阅读全文
摘要:参考资料: "最短路径算法—Bellman Ford(贝尔曼 福特)算法分析与实现(C/C++)" " Bellman Ford算法详讲 " 算法推导建议参考第一篇文章,讲的很详细。 解析(摘自参考资料): Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权
阅读全文
摘要:参考: "Dijkstra算法" 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关。于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法。 Dijkstra的经典应用是开放最短路径优先路由算法(OSPF)。 题目: 第一种实现的算法(错误): 在看过相关的Dijkstra
阅读全文
摘要:题目: 代码: 6 input a input b ctrl+z ctrl+z ctrl+y ctrl+y 输出为b,但是正确的答案应该是b a 2016/11/11
阅读全文
摘要:题目: 算法设计: 计算最小值算法: 设置一个flag,flag为1的时候代表遇到 号; 遇到数字时: flag为0进栈; flag为1的时候,从栈顶提出一个元素和当前元素运算,结果进栈 最后对栈进行加法运算,得到结果,mod。 计算最大值算法: 设置一个flag,flag为1的时候代表遇到+号;
阅读全文