![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 58
ZoeGreenn
Stay hungry.Stay foolish.
展开
-
链表的实现(一)
#include#include struct LNode{ int data; struct LNode *next; }; typedef struct LNode *LinkList;void CreateList(LinkList* , int ); //创建链表void Insert(LinkList, int , int );原创 2015-05-24 21:20:15 · 779 阅读 · 0 评论 -
数据结构学习笔记(七)--图
图的存储方式一般分为邻接矩阵与邻接链表。矩阵操作简单,但稀疏图时采用链表效率更高。图的遍历:DFS(用递归实现) BFS(用队列实现,类似于树的层序遍历!)注意什么时候使用DFS什么时候使用BFS更好? **如果估计目标顶点离开起始顶点不会太远,那么选择广度优先遍历是比较合适的,因为广度优先是一种由近及远的搜索策略; 如果估计目标顶点与起始顶点没有太大的关系,那么选择深度优先遍历是比较合适的原创 2016-04-13 22:29:40 · 651 阅读 · 0 评论 -
数据结构学习笔记(九)-各大排序算法
一、简单排序1. 冒泡排序其思想是每次比较相邻的两个元素,如果后一个比它小则交换两个元素的顺序,直到将最大的数冒出来(假设是从小到大排)。那么我们需要进行N-1趟排序,每次最坏的情况交换N-1次,则时间复杂度为二次。2. 插入排序对于喜欢打扑克的人都知道,抓牌后我们需要将其插入到合适的位置,就需要将其与当前手中的牌一一 比较,直到找到那个比它小的数(假如是从小到大排)。那么对于一个数组int A[N原创 2016-04-28 14:40:00 · 1907 阅读 · 0 评论 -
数据结构学习笔记(八)--最短路径
最短路径问题分好几种。无权图的单源最短路径:直接用BFS即可有权图的单源最短路径:Dijkstra算法多源最短路径:Floyd算法(适合于稠密图)有负权值的最短路径原创 2016-04-16 14:49:48 · 466 阅读 · 0 评论 -
C++ STL泛型编程——在ACM中的运用
学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生。两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想。这次想简单说一下STL在ACM中的一些应用。我们知道,在ACM竞赛中,经常需要用到数组、字符串、队列、堆栈、链表等数据结构和排序、搜索等算法,以提高程序的时间、空间运行效率。然而如果这些数据结构总是需要手工来编写,那无疑会是一件很麻烦的工作转载 2016-04-16 14:58:08 · 498 阅读 · 0 评论 -
数据结构学习笔记(十)-图的最小生成树与拓扑排序
一、最小生成树首先应该理解最小生成树的定义: 包含图的所有顶点,V-1条边 没有回路 边的权重和最小那么实际问题中用到最小生成树是什么时候呢?很多人都觉得学习算法没用,在实际生活工作中根本就用不上,其实并不是用不上,只是你根本没有想到要去用而已!使用了算法后你就会发现事情原来可以这么简单高效! 实际中如需要使用最少的电线给一栋房子安装电路。就可以用最小生成树解决。1. Prim算原创 2016-05-02 11:59:09 · 3200 阅读 · 0 评论 -
[递归]Simple prefix compression
原题地址:Simple prefix compression主要的知识点是递归,但是貌似这题不用递归也可以。不过还是复习下递归的知识点吧。 递归是指某个函数直接或间接的调用自身。问题的求解过程就 是划分成许多相同性质的子问题的求解,而小问题的求解过程 可以很容易的求出,这些子问题的解就构成里原问题的解。递归解题的总体思想:将待求解问题的解看作输入变量x的函数f(x)通过寻找函数g,使得f(原创 2016-06-02 22:55:41 · 673 阅读 · 0 评论 -
[递归]poj 1057 FILE MAPPING
原题地址:这里写链接内容这题也是递归解法。原创 2016-06-03 14:39:37 · 941 阅读 · 0 评论 -
[递归]poj1664 放苹果
Description把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output对输入的每组数据M和N,用一行输出相应的K。 Sample Input1 7 3 Sampl原创 2016-06-03 15:14:05 · 336 阅读 · 0 评论 -
[动态规划]数字三角形、最长上升子序列
POJ 1163 数字三角形7 3 8 8 1 0 2 7 4 4 4 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径, 使得路径上所经过的数字之和最大。路径上的每一步都 只能往左下或右下走。只需要求出这个最大和即可,不 必给出具体路径。 三角形的行数大于1小于等于100 数字为 0 - 99解法:这道题用递归做是解法很显然的:递归 设f(i,j) 为三角形上从原创 2016-07-10 16:49:39 · 673 阅读 · 0 评论 -
5. Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 原题这题开始想用递归,没写出来,看了题解,原来可以原创 2016-06-15 23:13:15 · 333 阅读 · 0 评论 -
[搜索]八数码问题
搜索:高级枚举 有顺序有策略地枚举状态空间中的节点,寻找问题 的解 状态空间 由所有状态构成的状态树经典八数码问题: 有一个3*3的棋盘,其中有0-8共9个数字,0表示空 格,其他的数字可以和0交换位置。求由初始状态 到达目标状态的步数最少的解?8 2 3 1 4 6 5 7 0 —> 1 2 3 4 5 6 7 8 0解原创 2016-06-15 23:36:16 · 1415 阅读 · 0 评论 -
[搜索]广搜的两道题
抓住那头牛(POJ3278) 广度优先搜索算法如下:(用QUEUE) (1) 把初始节点S0放入Open表中; (2) 如果Open表为空,则问题无解,失败 退出; (3) 把Open表的第一个节点取出放入 Closed表,并记该节点为n; (4) 考察节点n是否为目标节点。若是, 则得到问题的解,成功退出; (5) 若节点n不可扩展,则转第(2)步; (6)原创 2016-07-04 10:49:46 · 556 阅读 · 0 评论 -
数据结构学习笔记(四)
本篇主要是两个关于二叉搜索树的练习。 题目来源:浙江大学PATtest先上代码:/*判断是否是同一棵二叉搜索树:对于各种输入不同的序列,判断它们是否构成一样的二叉搜索树*/#include <cstdio>#include <cstdlib>#include <stack>using namespace std;//二叉树的表示typedef int DataType;typedef原创 2016-04-07 22:49:19 · 454 阅读 · 0 评论 -
数据结构学习笔记(六)堆-优先队列
基础知识什么是堆?为什么要建立堆这种数据结构?堆的实际用处是?(堆排序)应该采用哪种存储结构来存储堆? 因为要使堆的插入、删除等各种基本操作效率最高,所以采用完全二叉树的形式存储堆。完全二叉树的一些重要性质:若父节点序号为i,则左儿子序号为2i,右儿子序号为2i+1。若某儿子序号为i,则其父节点序号为[i/2](取整)。怎样插入元素到堆中呢? 假如是最大堆,删除最大元素即删除根节点,那么就原创 2016-04-09 21:23:46 · 294 阅读 · 0 评论 -
栈的实现
#include#include#include#include #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */#define STACKINCREMENT 2 /* 存储空间分配增量 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE原创 2015-05-25 18:46:30 · 402 阅读 · 0 评论 -
插入排序
插入排序的思想便是“逐个比较”。 1 文字表述: 1)设置一个循环,从第二个数字开始(索引为1)不断与前面的数字相比。2)每次循环开始时作为比较的数的索引为j,设置temp为其值。(因为比如将”8“赋值到”7“的位置时,如果不将”7“保存起来,那么便丢失了这个数字。)3)取得j的前一位i。4)只要i仍在数组中,并且索引为i处的值大于temp,就将i原创 2015-08-13 16:41:47 · 379 阅读 · 0 评论 -
栈的链表实现
栈和队列,作为计算机中很重要的两种数据结构,它们的数据组织方式均可用数组和链表实现,只是存取数据时的方式有所差别。一个是遵循“先进后出”,一个是遵循“先进先出”的原则。 链表实现: #include#includestruct Node;typedef struct Node *ptrtonode;typedef ptrtonode原创 2015-08-13 16:30:01 · 532 阅读 · 0 评论 -
归并排序
很多时候我们碰到的问题很复杂,一眼望去找不到解决的办法。但是对于解决小问题常常不在话下,那么有种思想就促使我们能不能把复杂的问题分解成一个个小问题加以解决最后再归并起来呢?也许分一步的结果仍不容易解决,我们就继续分解,直到分到最简单的问题为止。这种思想在我们生活中很常见,而在算法中,它其实是一种“分治策略”。 分治策略所引出的排序方法便是归并排序。 归并排序的思想是原创 2015-08-13 16:42:30 · 396 阅读 · 0 评论 -
链表的实现(二)
头文件:list.htypedef int ElementType;#ifndef _LIST_H#define _LIST_Hstruct node;//节点typedef struct node *ptr_node;//指向节点的指针typedef ptr_node List;typedef ptr_node position;List init_list(v原创 2015-08-18 16:20:27 · 449 阅读 · 0 评论 -
数组循环右移
描述:将一个长度为 n 的数组 A 的元素循环右移(ROR, Rotate Right)k 位,比如数组 1, 2, 3, 4, 5 循环右移 3 位之后就变成 3, 4, 5, 1, 2。 要求:只能用一个元素大小的附加存储,元素移动或交换次数为O(n)。开始时自己想的算法就是最简单原始的一种: 每次将数组右移一位,循环k次:void function(int *A,int n,int k){原创 2016-03-03 16:54:04 · 1192 阅读 · 0 评论 -
贪心算法之完美字符串
#include#include#include#includeusing namespace std;char s[10001];int b[10001];int cmp(int x,int y){ return x>y;}int main(){ int sum,n,m,k; while(scanf("%s",s)!=EOF) { int i,l=strl原创 2016-02-23 21:40:23 · 1254 阅读 · 0 评论 -
二叉树的各种运算及遍历实现
//二叉查找树的链式表示及算法实现//by zoe#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>using namespace std;typedef struct node* position;typedef int DataType;struct node{ DataType data;原创 2016-03-12 11:14:47 · 762 阅读 · 0 评论 -
数据结构学习笔记(五)
习题:平衡二叉树。 Root of AVL Tree 总结注意弄清楚:为什么要对二叉搜索树进行平衡操作平衡二叉树是怎样旋转的。基本旋转操作有哪些。/*确定平衡二叉树的根节点*/#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;//定义平衡二叉树typedef int DataType;原创 2016-04-08 01:19:20 · 339 阅读 · 0 评论 -
数据结构学习笔记(一)
本系列是网易云课堂浙大数据结构课程的一些笔记。课程配套了一些编程练习,以加深理解与编程能力。提高编程的方法无他,唯多看,多练,多思考。 首先介绍了一些基本的算法概念,分析。 然后给出了一个求最大子序列和的例子,给出了四种时间复杂度不同算法实现,可以体会到算法的有效设计对程序效率的影响是很大的,特别是数据集很大的时候。 #include <iostream>#include <stack>#原创 2016-03-26 20:24:35 · 353 阅读 · 0 评论 -
数据结构学习笔记(二)多项式加法与乘法
之前自己看书学链表、栈、队列,觉得比较难懂,还是得自己动手实践下。这次就是实现一个多项式的加法和乘法运算,主要是要求熟练链表的各种操作。 看看程序的大体框架是:设计数据结构:多项式的表示。可以用数组和链表。数组需事先确定数组大小,链表则对动态操作比较有利。读多项式:这里需要设计一个attach函数,是用来将新的结点插入链尾的。加法实现:多项式相加其实就是比较指数,相同则合并同类项,不同则直接原创 2016-03-26 23:39:12 · 2877 阅读 · 1 评论 -
数据结构学习笔记(三)二叉树的非递归遍历
树的三种遍历方法很熟悉,常见的是用递归解决:先序:根左右中序:左根右后序:左右根仔细回想一下树的三种遍历算法,可以发现原来遍历过程中经过节点的路线一样,只是访问时机不同!如上图,可以发现遍历过程中每个节点都有三次经过它的时机,如B点,首先经过它是先序遍历时,其次是中序遍历时,最后是后序遍历时那么。对于一个节点,第一次碰到就访问则是先序,第二次碰到访问是中序,第三次碰到访问是后序。我们可以根据原创 2016-03-27 10:19:26 · 523 阅读 · 0 评论 -
[动态规划]最长公共子序列
动态规划的本质动态规划的实质就是:记忆化搜索。对于要用动态规划进行解决的问题的特点:问题具有最优子结构性质:如果问题的最优解包含的子问题的解也是最优的,就称该问题具有最优子结构。问题具有子问题重叠性质:再用递归进行自顶向下计算时,每次产生的子问题并不都是新的,可能会存在子问题重复计算,动态规划就可以对每个子问题只计算一次,将结果保存起来,以便高效利用。再来看一个问题: 最长公共子序列 POJ1原创 2016-07-20 01:06:44 · 595 阅读 · 0 评论