算法
vivian陈薇
Android 程序媛
展开
-
二叉树遍历的各种算法
二叉树的遍历是指按照一定次序访问二叉树中的所有节点,且每个节点仅被访问一次的过程。是最基本的运算,是其他运算的基础。 二叉树有两种存储结构:顺序存储和链式存储 顺序存储: (对完全二叉树来说,可以充分利用存储空间,但对于一般的二叉树,只有少数的存储单元被利用)[cpp] view plaincopytype转载 2014-01-10 16:12:18 · 1061 阅读 · 0 评论 -
Dijkstra
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条转载 2014-01-10 21:11:40 · 1100 阅读 · 0 评论 -
图的表示--邻接表
图的表示: 主要有两种,邻接矩阵和邻接表,前者空间复杂度,O(V2),后者为O(V+E)。因此,除非非常稠密的图(边非常多),一般后者优越于前者。上篇讨论了邻接矩阵的实现,本篇讨论邻接表的实现GraphLink.h[cpp] view plaincopy#include "Graph.h" #incl转载 2014-01-10 21:17:53 · 888 阅读 · 0 评论 -
最小堆
最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者的堆。最小堆:根结点的键值是所有堆结点键值中最小者的堆。不失一般性,只讨论根结点为最小层的情况。插入[编辑]只需要将节点插在二叉树的最后一个叶子结点位置,然后比较它对它父亲节点的大小,如果大则停止;如果小则交换位置,然后对父亲节点递归该过程直至根节点。复杂度为O(log转载 2014-01-10 21:22:37 · 1043 阅读 · 0 评论 -
二叉树
最近在mooc上发现了清华、北大2门数据结构的课程,一直在潜心学习他们的课程,博客没有及时更新,今天刚刚学习了二叉树,趁热打铁,记录下二叉树的学习经历吧,老规矩,还是看代码二叉树节点类的实现:[cpp] view plaincopy#ifndef BINARY_TREE_NODE_H #define BINARY_TREE_NO转载 2014-01-10 21:25:21 · 904 阅读 · 0 评论 -
栈
堆栈(英语:stack),也可直接称栈。在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英语:top)进行加入资料(英语:push)和输出资料(英语:pop)的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。堆栈的另外一个相对的操作方式称为伫列。由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Las转载 2014-01-10 21:30:14 · 902 阅读 · 0 评论 -
各种排序算法及其C++实现
一、插入排序(Insertion Sort)基本思想:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。二、选择排序(Selection Sort)基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完为止。转载 2014-01-16 11:22:08 · 720 阅读 · 0 评论 -
基本数据结构:顺序表
顺序表,数组就是典型的顺序表,顺序表便于查询元素,单移动、删除时间开销比较大,好了废话少说,直接上代码,对照源码看吧[cpp] view plaincopy#ifndef SEQLIST_H #define SEQLIST_H #include #include using std::cin; usi转载 2014-01-16 11:26:34 · 719 阅读 · 0 评论 -
常见算法锦集
1. 字符串转化为整型[cpp] view plaincopyint charToInt(const char* str) { if (str == NULL) return 0; int flag = 1; if ( *str == '+' ) { ++st转载 2014-01-16 11:27:09 · 788 阅读 · 0 评论 -
九大排序方法
本文是 http://blog.csdn.net/xiazdong/article/details/7304239 的补充,当年看了《大话数据结构》总结的,但是现在看了《算法导论》,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍。本文首先介绍了基于比较模型的排序算法,即最坏复杂度都在Ω(nlgn)的排序算法,接着介绍了一些线性时间排序算法,这些排序算法虽然都在线性转载 2014-01-21 15:10:55 · 742 阅读 · 0 评论 -
归并排序
归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点转载 2014-01-10 21:08:18 · 625 阅读 · 0 评论 -
基本数据结构:单链表
链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))注意转载 2014-01-10 21:37:42 · 698 阅读 · 0 评论 -
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。一般应用拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集转载 2014-01-10 21:13:59 · 657 阅读 · 0 评论 -
图的表示--邻接矩阵
邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此。②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的和,而入度为第转载 2014-01-10 21:19:48 · 1183 阅读 · 0 评论 -
哈弗曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。基本术语哈夫曼树(霍夫曼树)又称为最优树.1、路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。转载 2014-01-10 21:20:51 · 867 阅读 · 0 评论 -
二叉查找树
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的查找树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉查找树中序周游二叉排序树可得到一个升序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程转载 2014-01-10 21:23:50 · 679 阅读 · 0 评论 -
递归的经典应用----汉诺塔问题
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。[cpp] view plaincopy#inclu转载 2014-01-10 21:26:53 · 1344 阅读 · 0 评论 -
基本数据结构:链式队列
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front)。 (2)允许插入的一端称为队尾(Rear)。 (3)当队列中没有元素时称为空队列。 (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。 队列的修改是依先进先出的原则进行的。新来的成员总是加入转载 2014-01-10 21:29:06 · 818 阅读 · 0 评论 -
插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。步骤⒈从有序数列{a1}和无序数列{a2,a3,…,an}开始进行排序;⒉处理第j个元素时(j=2,3,…,n),数列{a1,a2,…,aj-1}是已有序的,而数列{aj,aj+1,…,an}是无序转载 2014-01-10 21:31:55 · 628 阅读 · 0 评论 -
最大子序列和问题
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)转载 2014-01-10 21:33:15 · 892 阅读 · 0 评论 -
约瑟夫问题
约瑟夫问题是一个利用循环链表的经典问题,问题描述如下:(度娘搜滴)约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”) 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,转载 2014-01-10 21:34:31 · 978 阅读 · 0 评论 -
基本数据结构:循环单链表
上篇对单链表进行了详细说明,本篇接下来说说单循环链表单循环链表就是在单链表基础上,尾巴元素指向了头,形成了圆圈,操作时只要注意尾部元素链接头就OK,废话不多说,直接上代码单循环链表定义类 CircleLinkedList.h[cpp] view plaincopy#ifndef CIRCLE_LINKEDLIST_H #转载 2014-01-10 21:35:43 · 842 阅读 · 0 评论 -
排序算法总结
一、选择排序1. 基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。2. 排序过程:【示例】: 初始关键字 [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第二趟排序后 13 27 [65 97 76 49 38转载 2014-08-13 18:23:24 · 736 阅读 · 0 评论