码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法-----总结篇

时间:2015-06-17 18:22:04      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:数据结构   算法   冒泡排序   链表   二叉树   

一、数据结构

程序设计=数据结构+算法

1.逻辑结构

1)集合:元素之间没有联系。
2)线性结构:元素之间存在前后顺序。
3)树形结构:元素之间存在一对多的父子关系。
4)图状结构:元素之间存在多对多的映射关系。
2.物理结构
1)顺序结构:用连续的空间存放数据元素。
优点:便于随机访问。
缺点:空间利用率低,插入删除不方便。
2)链式结构:用不连续的空间存放数据元素,每个数据元素中处理存放数据意外,还要存放下一个元素的地址。
优点:空间利用率高,插入删除方便。
缺点:随机访问不方便。
3.逻辑结构和物理结构的关系
线性结构(表)- 顺序结构、链式结构
                 (数组)    (链表)
树形结构(树)- 顺序结构、链式结构
图状结构(图)- 复合结构
4.常用数据结构的实现
1)数组、串
2)堆栈:后进先出(LIFO)
3)队列:先进先出(FIFO)
4)链表:单向线性、双向线性、单向循环、双向循环

5)二叉树

1.基本特征
1)树型结构的最简模型,每个节点最多有两个子节点——左子节点和右子节点。
2)单根性,每个子节点有且仅有一个父节点,整棵树有且仅有一个根节点。
3)递归性,以任何一个节点为根都可以看做是一个二叉树,整个二叉树可以看成是由若干子二叉树按照递归的结构复合而成。这种结构的递归性决定了采用递归的算法解决二叉树问题会非常简单。
2.基本操作:按照特定的规则生成,再按照特定的规则遍历,将会产生特定的效果。
3.实现要点(以有序二叉树为例)
有序二叉树:对于树上的任何一个节点,其左子树中的节点都比该节点的值小或等,右子树中的节点都比该节点的值大或等。
50 70 20 60 40 30 10 90 80
         50
      __/  \__
     /|       \
   20 |        70
  /  \|       /  \
10    40    60    90
     /           /
   30          80
  /
10
前序遍历:D-L-R、D-R-L
中序遍历:L-D-R、R-D-L
后序遍历:L-R-D、R-L-D
有序二叉树的中序遍历:
10 20 30 40 50 60 70 80 90

6)图:有向图、无向图

二、堆栈

1.基本特征:后进先出
2.基本操作:压入(push),弹出(pop)
3.实现要点:初始化空间、栈顶指针、判空判满
1234 = 1*8^3 + 2*8^2 + 3*8^1 + 4*8^0

三、队列

1.基本特征:先进先出
2.基本操作:从后端(rear)压入(push),从前端(front)弹出(pop)
3.实现要点:初始化空间、从后端指针压入,从前端指针弹出,循环使用,判空判满

四、链表

1.基本特征:由一系列内存中不连续的节点组成,每个节点除了保存数据以外,还需要保存其前后节点的地址——双向链表。
2.基本操作
1)追加
2)插入
3)删除
4)遍历

5)伪随机访问

二、常用算法技巧

1.冒泡排序

1)算法
A.比较相邻的元素,如果第一个比第二个大就交换它们;
B.对每一对相邻的元素都做同样的工作,从开始的第一对到结尾的最后一对。经过这一步,最后的元素是最大值;
C.针对所有的元素重复以上步骤,除了最后一个;
D.持续每次对越来越少的元素重复以上步骤,直到没有元素需要交换。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性敏感。

2.插入排序

12 13 15 20 23 31 19 26 24
1)算法
A.从第一个元素开始,该元素可以认为已经有序;
B.取出下一个元素,在已经排序的元素序列中从后向前扫描;
C.若该元素大于新元素,则将该元素移到下一个位置;
D.若该元素小于或等于新元素,则将新元素插入到该元素之后;
E.重复步骤B,直至处理完所有的元素。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性敏感。相对冒泡排序,没有交换而仅仅是移动,略优于冒泡。

3.选择排序

12 13 15 23 20 31 19 26 24
1)算法
首先在未排序序列中找到最小元素,并于该序列的首元素做交换,再从剩余的未排序序列中继续寻找最小元素重复以上过程,直到未排序序列中仅剩一个元素为止。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性不敏感。相对冒泡而言,因为交换的次数少,略优于冒泡。
4.快速排序
50
0 10 20 30 40 50 80 70 60 90 100
              i
              p
              j
1)算法
A.从序列中找出一个元素作为基准;
B.从新组织序列,所有小于基准的元素都位于基准的左侧,所有大于基准的元素都位于基准的右侧,与基准相等的元素可位于基准的任一侧;
C.以递归的方式分别对左右两个分组进行排序。
2)评价
平均时间复杂度O(NlogN),不稳定。理论上如果每次都能做到均匀分组,会得到的最快的排序速度。
思考:实现qsort()函数。

4.归并排序

平均时间复杂度O(2NlogN),稳定,对数据有序性不敏感,非就地排序,不适用于对海量数据进行排序。

5.线性查找

1.算法:逐个比较,找到为止。
2.评价:O(N),对数据的有序性没有要求。

6.二分查找

1.算法:假设数据按升序排列,取中间位置值,如果目标等于中值,则查找成功;如果目标小于中值,则在中值左侧继续查找;如果目标大于中值,则在中值右侧继续查找;直到找到或者找不到为止。
2.评价:O(logN),数据必须有序。

数据结构与算法-----总结篇

标签:数据结构   算法   冒泡排序   链表   二叉树   

原文地址:http://blog.csdn.net/hnlyyk/article/details/46535593

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!