算法Go语言描述📌datastruct📌0_基本概念.txt
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构分为逻辑结构和物理结构。
逻辑结构是指数据对象中数据元素之间的相互关系。
集合结构:数据结构中的元素之间的关系是“同属一个集合”;
线性结构:数据结构中的元素存在一对一的相互关系;
树形结构:数据结构中的元素存在一对多的相互关系;
图形结构:数据结构中的元素存在多对多的相互关系。
数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。
一种数据结构可表示成一种或多种存储结构。
顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
由此得到的存储表示称为顺序存储结构,通常借助于程序设计语言中的数组来实现。
链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为链式存储结构,通常借助于程序设计语言中的指针类型来实现。
索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
通过算法时间复杂度来估算算法时间效率。常见的时间复杂度所耗时间的大小排列:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
========== ========== ========== ========== ==========
常用数据结构:
数组(Array)是一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
字符串(String)是由零个或多个的字符组成的有限序列,一般表示为”a1a2…an”。串中字符的个数称为串的长度。
任意连续的字符组成的子序列称为该串的子串,子串的位置为子串第一个字符在原串中的位置
链表(LinkedList)是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
这些数据元素可以存在内存未被占用的任意位置,除了要存数据元素信息外,还要存储它的后继元素的存储地址。
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,
这种头尾相接的单链表称为单循环链表,简称循环链表(CircularLinkedList)。
双向链表(DoubleLinkedList)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。双向链表也可以是循环表。
双向链表相对于单链表来说,由于每个结点都需要记录两份指针,所以在空间上是要占用略多一些的。
不过,由于它良好的对称性,使得对某个结点的前后结点的操作,带来了方便,可以有效提高算法的时间性能。就是用空间来换时间。
链表和数组可以用来辅助构建各种基本数据结构。
栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。
队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。
栈是后进先出(LastInFirstOut)的线性表,简称LIFO。队列是先进先出(FirstInFirstOut)的线性表,简称FIFO。
集合(Set)是由一组无序但彼此之间又有一定相关性的成员构成的,每个成员在集合中只能出现一次。没有包含任何成员的集合称为空集。
如果两个集合中所包含的成员完全一样,则称这两个集合相等。如果集合S2包含另一个集合S1的所有成员,则S1是S2的子集。
字典(Map)是一种以“键-值”对(key-value)形式存储数据的数据结构。key唯一不可重复。
散列表(HashTable),是根据键而直接访问在内存存储位置的数据结构。
它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。
这个映射函数称做散列(Hash)函数,存放记录的数组称做散列表。
首先有一个大数组,每当存一个键值对时,先把键进行哈希,计算出的哈希值是一个整数,
使用这个整数对数组长度取余,映射到数组的某个下标,把该键值对存起来。
树(Tree)是有限节点组成的具有层次关系的集合。树的结点包含一个数据元素及若干指向其子树的分支。
结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。
除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。
森林(Forest)是互不相交的树的集合。对于树中每个结点而言,其子树的集合即为森林。
二叉树(BinaryTree)是一种特殊的树,它的子节点个数不超过两个。
满二叉树(FullBinaryTree)叶子只能出现在最下一层,非叶子结点的度一定是2,树呈满三角形结构。
完全二叉树(CompleteBinaryTree)由满二叉树而引出来,最下层的叶子一定集中在左部连续位置。
堆(Heap)是用数组实现的完全二叉树。堆是非线性数据结构,相当于一维数组,有两个直接后继。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)。
G表示一个图,V是图G中顶点(Vertex)的集合,E是图G中边(Edge)的集合。
在图结构中,不允许没有顶点。在定义中,若V是顶点的集合,则强调了顶点集合V有穷非空。
若顶点vi到vj之间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)来表示。
如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected-graphs)。
若从顶点vi到vj的边有方向,则称这条边为有向边,也称为弧(Arc)。用有序偶<vi,vj>来表示,vi称为弧尾(Tail),vj称为弧头(Head)。
如果图中任意两个顶点之间的边都是有向边,则称该图为有向图(Directed-graphs)。
在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边。
在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的有向完全图有n×(n-1)条边。
对于具有n个顶点和e条边数的图,无向图0≤e≤n(n-1)/2,有向图0≤e≤n(n-1)。
与图的边或弧相关的数叫做权(Weight)。这些权可以表示从一个顶点到另一个顶点的距离或耗费。这种带权的图通常称为网(Network)。