一、单纯的数据结构
1.栈和队列共同特点:只允许在端点处插入和删除元素
2.线性表:
顺序存储结构:查找快O(1),增删慢O(n),好处是便于查找
链式存储结构:查找慢O(n),增删快O(1)。链表内存中可用的存储单元的地址可以是连续的也可以是不连续的。好处是便于插入和删除操作。
常考:
单链表中,增加头结点的目的:方便运算的实现
循环链表的优点:从表中任一结点出发都能访问到整个链表。
非空的循环单链表head的尾结点(p指向)满足:p->next=head
线性表:除了第一个和最后一个元素,其余每个元素有且只有一个直接前驱和直接后继。
线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的。
与单向链表相比,双向链表的优点之一是:更容易访问相邻结点。
3.数据的存储结构:数据的逻辑结构在计算机中的表示
数据的逻辑结构:反映数据元素之间逻辑关系的数据结构
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为:线性结构和非线性结构
4.栈:是先进后出的线性表
数据结构中具有记忆功能的是栈。
由两个栈共享一个存储空间的好处:节省存储空间,降低上溢发生的机率。
栈的基本运算:入栈、退栈与读栈顶元素
5.队列:先进先出的线性表
递归算法一般用队列实现
队列的基本运算:入队和出队。
6.线性结构:其特点是数据元素之间存在一对一的线性关系。线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。
线性表、队列、栈属于线性结构。但队列和栈是受限的线性结构。
二叉树属于非线性数据结构
7、树:
在第n层的二叉树上总节点数最多是2^n-1
深度为n的满二叉树,叶子节点个数为2^(n-1)
完全二叉树的总结点数为N,N为奇数,则叶子节点数位(N+1)/2;N为偶数,则叶子节点数位N/2
8、串的长度是:串中所含字符的个数
9.图:
10。常用的存储结构:顺序、链接、索引等存储结构
11、数组和链表的区别。(很简单,但是很常考,记得要回答全面)
C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,他采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
从逻辑结构上来看,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。
从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。
从访问方式类看,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。
二、数据结构与算法:
(一)排序算法:
1、插入排序:
直接插入排序:从后往前找合适的位置,直接插入
二分插入排序:用二分法找合适的位置,插入
希尔排序:
2、选择排序:
简单选择排序:每次选最小的或者最大的换到第一位
堆排序:二叉树然后换换
3、交换排序:
冒泡排序:比较两个相邻的数之间的关系与排序要求是否一致,不一致则交换
快速排序:每轮以第一个数作为基准,从后往前找比基准小的数,进行交换,再从前往后找比基准大的数进行交换,直到基准所在的位置前面的数都比他小,后面的数都比他大。
4、归并排序:已经排好序的2个或以上的数组再进行归并排序
5、基数排序:所有数值统一为同样的数位长度,数位较短的前面补0,从最低位开始排序到最高位。
最基本的是冒泡排序,选择排序,插入排序要可以很快地用代码实现。这些主要考察你的实际编码能力。堆排序,归并排序,快速排序这些算法需要熟悉主要思想,和需要注意的细节地方。
(二)查找算法:
二分查找
图之深度优先与广度优先:
深度优先:从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
无向图的深度优先:
ADBDFGE
有向图的深度优先:
ABCEDFG
广度优先:又称为"宽度优先搜索"或"横向优先搜索",简称BFS。
从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
无向图的广度优先:
ACDFBGE
有向图的广度优先:
ABCEFDG
注意!:1、同层的则按字母顺序优先;2、如果是从邻接图演变的,邻接图是有顺序的,按那个顺序。
148、求图的拓扑序列(只有有向图有):找出图中无前驱节点的节点,依次输出删去。一个图的拓扑序列可以有多种。
深度优先和拓扑序列可以判断出一个有向图是否有环。