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

一、数据结构

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

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),数据必须有序。

时间: 2024-07-31 10:05:26

数据结构与算法-----总结篇的相关文章

数据结构与算法-----队列篇

队列 1.基本特征:先进先出 2.基本操作:从后端(rear)压入(push),从前端(front)弹出(pop) 3.实现要点:初始化空间.从后端指针压入,从前端指针弹出, 循环使用,判空判满 实践1 :使用C++语言实现队列类并进行数据示例演示 #include <iostream> using namespace std; class Queue { public: // 构造函数中分配内存空间 Queue (size_t size) : m_data (new int[size]),

数据结构与算法-----链表篇

链表 1.基本特征:由一系列内存中不连续的节点组成,每个节点除了保存数据以外,还需要保存其前后节点的地址--双向链表. 2.基本操作 1)追加 2)插入 3)删除 4)遍历 5)伪随机访问 示例:使用C++实现双向链表类,并演示结果: #include <iostream> using namespace std; class List { public: // 构造函数中初始化为空链表 List (void) : m_head (NULL), m_tail (NULL) {} // 析构函数

数据结构与算法-----堆栈篇

堆栈 1.基本特征:后进先出 2.基本操作:压入(push),弹出(pop) 3.实现要点:初始化空间.栈顶指针.判空判满 实践:使用C++语言实现堆栈类,进行示例演示并且根据此堆栈类实现进制的转换. #include <iostream> using namespace std; class Stack { public: // 构造函数中分配内存空间 Stack (size_t size = 10) : m_data (new int[size]), m_size (size), m_to

数据结构与算法javascript描述笔记--数组篇

数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 ① 使用 [] 操作符 ,var arr=[] ,该方法效率最高. ② 调用 Array 的构造函数创建数组,var myArr=new

翻阅《数据结构与算法javascript描述》--数组篇

导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 使用 [] 操作符 ,var a

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h

数据结构与算法 基于c语言篇

学习数据结构与算法走向深蓝之路 第一章:数据结构与算法概念型 数据结构:数据之间的相互关系,即是数据的组织形式. 基本组成:{ 数据:信息的载体 数据元素:数据基本单位: } 其结构形式有四种: 1,集合结构  2,线性结构.   3,树形结构  4,图形结构 在计算机中的存储有量中形式: 顺序存储(数组形式)和非顺序存储(链式存储结构) 1.1抽象数据类型:指的是数据模型或者定义在数据模型上的一组操作 (D,R,P){ D是数据对象, R是D上的关系集 P是对D进行的操作} ListInser

《数据结构与算法》和《设计模式》之开门见山篇

老生常谈的话题,大家都知道程序是由数据和指令构成,数据结构和算法很重要,可是我就是没有时间去仔细琢磨这东东啊.借口!在国内浮躁的IT氛围之大环境影响下,确实要做到想大学时那样,从头到尾把数据结构的东西看个遍真的很难. 有人认为数据结构这东西平时根本就用不上,最多可能会用到诸如链表和一些排序算法而已,而这些东西随便在网上度娘一下就一大堆.你顺手“借鉴一下”,Copy下,调试了没问题.你大可以说你自己会了.而且你还是“站在巨人的肩上”.用小沈阳的话“有意思吗”,“没意思”.有人认为数据结构这东西太难

程序员书单_数据结构和算法篇

大话数据结构 程杰 著 http://download.csdn.net/detail/shenzhq1980/9145645Java数据结构和算法.(第二版) http://download.csdn.net/detail/shenzhq1980/9145633