数据结构之必需知

 时间复杂度:  

  在实际应用中,尽量使用对数阶 O(log n),而非指数阶(O(n^k),

堆栈:后进先出
  举例:数值转换。比如在将一个输入的十进制数转换为,打印与其等值的八进制数,即用堆栈比较合适(转换八进制时是从低位开始,输出是从高位))
另外还有括号匹配的检验(当匹配时,随着括号的增多,与其匹配的括号只好先进栈,到匹配最后一个时,在出战)

迷宫求解:穷举法(一个一个试,失败重试),
汉诺塔问题(栈与其递归求解)

队列:先进先出(FIFO)
  举例:操作系统中的作业排队

串 模式匹配的一种改进算法(KMP)

   在对于一个一个字符进行匹配时,当遇到不一样的时,不需要进行重新移动字符串重新匹配,只需将之前部分匹配过的字符串向前移动一段距离后,继续 

进行比较即可。

广义表:(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。

  广义表中放松对表元素的原子限制,容许它们具有其自身结构。

树  树是由一个或多个结点组成的有限集合。树是一种重要的非线性数据结构,
  结构特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。

二叉树 性质:
(1) 在二叉树中,第i层的结点总数不超过2^(i-1);

(2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;

(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,

则N0=N2+1;(二叉树中度都是小于等于2)

(4) 具有n个结点的完全二叉树的深度为int(log2n)+1

(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

若I为结点编号则 如果I>1,则其父结点的编号为I/2;

如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子

如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。

二叉树的存储结构:

(1)顺序存储方式 (2)链表存储方式

二叉树的遍历:

1.中序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。

2.先序遍历的递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3) 遍历右子树。

3.后序遍历得递归算法定义:
 若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。

图的遍历顺序有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先,就是只要存在后续节点就一直往下走,直到没有后续节点或者后续节点已经被访问输出了;

广度优先,就是节点一层一层的输出。

 

哈希表:利用键值对存储并检索数据的一种非线性结构
哈希函数是从关键字集合到地址集合的映像

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度

在一般情况下,哈希函数是一个压缩映像,这就不可避免产生冲突。因此,在建造哈希表时不仅要设定一个”好“的哈希函数,而且要设定一种处理冲突的方法。

 综上所述,可如下描述哈希表:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续地址集上,并以关键字在地址集中的”像“作为记录在表中存储位
置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或者散列地址。


内部排序:

插入排序。
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕
例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成
有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。

 快速排序:

快速排序是基于分治思想的一种排序算法。是一种内部排序,也就是说排序的对象是已经读入内存的数据.

快速排序的思想是:
  快速排序(Quicksort)是对冒泡排序的一种改进。先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一
个待处理的序列的长度为1, 处理结束.
  快速排序就是递归调用过程 (细节自己悟)

分治思想:
分:选择一个基准键值A[i],把所有元素按照大小分成两部分;(这样能确定一个元素的最后位置)
治:把两个子序列分别进行快排直到只剩下一个元素。

选择排序(Selection sort)是一种简单直观的排序算法。
它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序
列的末尾。以此类推,直到所有元素均排序完毕。
时间复杂度:O(n2)


希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在
同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时
,整个数列就是有序的。


堆排序:堆实际上是一棵完全二叉树

利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

其基本思想为(大顶堆):

1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区;

2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];

3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和
新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。


归并排序:
   归并排序(MergeSort)的基本思想是:将待排序文件看成为n个长度为1的有序子文件,把这些子文件两两归并,使得到「n/2」个长度为2的有序子文件;然后再把这「n/2」个有序文件的子文件两两归并,如此反复,直到最后得到一个长度为n的有序文件为止,这种排序方法成为二路归并排序。
归并排序的时间复杂度是O(N*lgN)。

另外还有 基数排序等内部排序方式等。

原文地址:https://www.cnblogs.com/shuaishuai1993/p/4908914.html