数据结构与算法
文章平均质量分 78
数据结构包括:线性表、链表、栈、队列、树;
算法主要是以上数据结构的基本操作,以及排序查找等问题。这些都是在笔试面试中常考的问题。
最后会介绍一些经典算法模式,比如递归、分治、动态规划等。
微岩
这个作者很懒,什么都没留下…
展开
-
平衡树(AVL)详解
1. 为什么平衡树?在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表(整棵树中只有左子树,或者只有右子树),这将大大影响二叉树的性能。前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。他们在1962年发表的一篇名为《An algorithm for the organization of inform原创 2013-10-07 19:30:04 · 2781 阅读 · 1 评论 -
图(Graph)——最小生成树、最短路径、Kruskal、Dijkstra、Floyd
4. 最小生成树4.1 生成树(1)定义:所有顶点均由边连接在一起,但不存在回路的图叫该图的生成树(2)深度优先生成树与广度优先生成树(3) 一个图可以有许多棵不同的生成树 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同 生成树是图的极小连通子图4.2 最小生成树生成树的每条边上的原创 2013-09-21 19:50:33 · 17597 阅读 · 0 评论 -
图(Graph)——基本概念、存储、遍历
1. 图的基本概念图(Graph):G = ( V,E )V(G):顶点E(G):边(1)边:(2)权:与图的边或弧相关的个数(3)子图:如果图G(V,E)和图G‘(V’,E‘),满足:V’属于V && E’属于E(4)顶点的度: 无向图:与顶点相连的边数 有向图: 入度:以该顶点为头的弧的数目 出度:以原创 2013-09-21 09:36:59 · 4267 阅读 · 0 评论 -
快速排序的时间复杂度nlogn是如何推导的??
本文以快速排序为例,推导了快排的时间复杂度nlogn是如何得来的,其它算法与其类似。对数据Data = { x1, x2... xn }:T(n)是QuickSort(n)消耗的时间;P(n)是Partition(n)消耗的时间;(注:Partition专指把n个数据分为大小2份的时间)原创 2013-07-16 14:31:26 · 15015 阅读 · 0 评论 -
快速排序算法原理与实现
摘要:本文描述了快速排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2.问题分析快速排序:最基本的思想就是通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。排序过程:(对原创 2013-07-13 21:48:08 · 3615 阅读 · 2 评论 -
希尔排序算法原理与实现
本文描述了希尔排序的算法原理,并且分析了算法的性能与选取的步长直接相关。最后给出了算法的C++实现程序。原创 2013-07-12 18:15:16 · 4817 阅读 · 0 评论 -
插入排序算法原理与实现
摘要:本文描述了插入排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2.问题分析(1)从有序数列和无序数列{a2,a3,…,an}开始进行排序;(2)处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无原创 2013-07-12 14:00:03 · 2311 阅读 · 0 评论 -
选择排序算法原理与实现
摘要:本文描述了选择排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2. 问题分析选择排序:它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排原创 2013-07-11 21:24:15 · 2386 阅读 · 0 评论 -
冒泡排序算法原理与实现
摘要:本文描述了冒泡排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述把数据列Data = {x1, x2, x3, ....,xn},按照非递减顺序排列。2. 问题分析冒泡排序:这一种最为简单的排序算法,每一次从数列中选取最大(最小)的数,然后把它放在最后(前面),重复执行此操作,直至所有数据有序。3. 算法实现template void BubbleSort( CVector &vec ){ size_原创 2013-07-11 21:04:24 · 6027 阅读 · 1 评论 -
排序算法理论与总结
1. 前言排序和查找是计算机科学中非常重要的一个课题,也是处理事务时常遇到的问题。可以说排序和查找是程序员必须掌握的基础知识。当前排序算法所要处理的问题特点:(1)数据量大(2)数据分布不集中2. 排序的基本思想一个优秀的排序算法必须遵循的思想:分而治之(Divide-Conquer-Merge)3. 算法分类分类基础排序O(n^2)原创 2013-07-11 16:00:21 · 1723 阅读 · 0 评论 -
树——(5)二叉搜索树
1. 定义你可以理解为折半查找以二叉树形式的表象。2. 操作2.1 查找2.2 插入2.3 删除3. 结构3.1 Tree Nodelchilddatarchildparent3.2 实现原创 2013-07-04 17:44:28 · 1922 阅读 · 0 评论 -
树——(4)线索二叉树
1. 定义1.1 起源对于n个节点的二叉树,会有多少个空指针域呢? Key: n+1个对于n+1个NULL指针能不能够很好的利用起来呢??1.2 线索二叉树利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这样的二叉树叫线索二叉树。如果前驱和后继分别对应先序遍历,那么这叫先序线索树,同样有中序线索树,后原创 2013-07-04 15:52:36 · 1686 阅读 · 0 评论 -
树——(2)树的存储:数组,链表
摘要:本文以二叉树树为例,描述树的两种存储方式——数组和链表,最后给出了二叉树的链式结构结点的详细实现。1. 数组1.1 普通树二叉树中各个节点的关系:结点编号123456789101112131415结点值12345000067原创 2013-07-04 10:43:13 · 1982 阅读 · 0 评论 -
树——(1)综述:二叉树,线索二叉树,二叉搜索树,B-/B+树,AVL树,红黑树
tree1. 定义树是n(n>=0)个结点的有限集。在任意一棵非空树中: (1)有且仅有一个特定的称为根的结点; (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,...Tm,其中每一个集合本身又是一棵树,并且称为根的子树.2. 树的基本概念:度:结点拥有的子树数称为结点的度。叶子(终端结点):度为0的结点称为叶子或终端结点。分原创 2013-06-27 17:56:31 · 3683 阅读 · 4 评论 -
跳表(Skip List)的介绍以及查找插入删除等操作
什么是跳表?要说清楚这个问题,我们就要先从普通的有序链表说起。一个普通有序列表的结构如下:我们可以看到,上图所示的链表按照由小到大的顺序排列(-1表示最小值,1表示最大值,这是本文的一个约定),如果我们想要查找一个元素x,算法如下:123cell *p = head;while (p->next->key x) p=p->next;retu转载 2013-09-25 14:43:40 · 3096 阅读 · 0 评论 -
list反转
1. 问题描述已知1个List: 1->2->3->4->5;要求把List反转变为:5->4->3->2->1。2. 问题分析问题很简单,新创建一个list:(1)从List中取首元素l;(2)把这个元素l,按照前插法插入到list中(3)重复(1)(2),直到List中没有元素3. 算法实现List* ReverseList(List *list){原创 2013-06-08 17:16:23 · 2204 阅读 · 1 评论 -
线性表——2. 链表
1. 定义链表就是每一个节点包含2部分:数据域+指针域(指向其它节点)链表根据其指针域的不同可以分为多个种类。本文只涉及单链表的操作,双向链表的操作与其类似。跳表的具体内容以后再说吧。1.1 单链表typedef int datatype typedef struct Lnode { datatype data;原创 2013-09-25 10:40:16 · 1918 阅读 · 1 评论 -
归并2个数组中的元素
1. 问题描述已知2个List:LA,LB中的数据按照非递减排列;要求把LA,LB中的合并成为一个List,其中数据也按照飞递减排列(包含重复数据)。2. 问题分析 / a if a C = \ b if a > b 3. 算法#define DataType intint MergeList( DataType原创 2013-06-06 13:59:09 · 1182 阅读 · 0 评论 -
仿C++ STL vector
通过对C++STL vector的分析,自己写了一个简单的Vector,作为学习用。1. Vector的特点:vector也就是顺序列表,是用类表示一维数组。(1)随机存取(2)在中间插入,删除操作比较麻烦,因为需要移动后面的数据。2. Vector ADT(1)属性size: Vector 中有元素个数capacity:Vector中可原创 2013-06-15 10:25:20 · 1798 阅读 · 0 评论 -
线性表——1. 顺序表(向量)
1. 顺序表顺序表就是以数组存储数据,在加上一些管理数据的方法。2. 操作2.1 访问访问:A[i]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O(1)2.2 插入insert(i, item). .原创 2013-09-24 10:00:16 · 2734 阅读 · 1 评论 -
计算机科学中最重要的32个算法
奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出转载 2013-06-23 09:31:06 · 1341 阅读 · 0 评论 -
算法分析O(n), O(nlogn)...
1. 定义大O符号(Big O notation)是用于描述函数渐近行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。2. 说明f(n) = 2n^2 + 3n + 1f(n) = O(n^2)orf(n) ∈ O(n^2)为什么可以这么去描述?lim( f(n) / n^2) = a ( n--> 0,原创 2013-07-11 16:09:09 · 8614 阅读 · 0 评论