lovebet爱博数据结构与算法总结。[转]数据结构(C#版)概念整理。

对数时间阶,2、数据元素(Data Element)和数据项(Data Item)

一:绪论

代表时间复杂度的阶有:

O(1) :常量时间阶段

O (n):线性时间等

O(㏒n) :对数时间阶段

O(n㏒n) :线性对数时间等

O (nk): k≥2 ,k次方时间等

以下六种植计算算法时间的差不多项式是极常用之。其关系也:

O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3)

指数日的涉及呢:

O(2n)<O(n!)<O(nn)

 

算法的空中复杂度定义为:S(n) = O(g(n))

代表随着问题规模 n 的增大,算法运行所需要贮存量S(n)的增长率和 g(n)
的增长率相同,称S(n)(渐近)空间复杂度。

        

第一章

二:线性表

顺序线性表:

一经于线性表L中的第i独要素之前插入结点的几率为Pi,不失一般性,设各个岗位插入是齐概率,则Pi=1/(n+1),而插入入常走结点的次数为n-i+1。

归根结底的平均移动次数: Einsert=∑pi*(n-i+1)  (1≦i≦n)

∴ Einsert=n/2 。

链式线性表:

单链表:

条例2.1假要下有限只线性表LA和LB分别代表两独集合A和B,现要求一个初的集合A=A∪B。

算法思想:1、扩大La,将有于Lb中设未存被La中的数额元素插入到La中失。2、需要打Lb中各个获得每个数据元素,并依值在La中开展侦查,若无有,则插 之。

条例2.3
已知线性表LA和LB中之多少元素是随值非递减有序排列,现要求以LA和LB归并也一个初的线性表LC,且LC中之数码元素呢是遵循值非递减有序排列。

1.初始化 LC 为空表;

2.分别由 LA和LB中获取时元素 ai 和 bj;

3.若 ai≤bj,则将 ai 插入到 LC 中,否则将bj 插入到 LC 中;

4.重复 2 暨 3 两步,直至 LA 或 LB 中元素被得了为止;

5.拿 LA 表或 LB 表中剩余元素复制插入到LC 表中。

(双向)循环链表:

盖瑟夫问题:

n 个人围成一个圈,首先第1私有从1开一个口一个口顺时针报数, 
报至第m民用,令其出列。然后重新起生一个总人口开始,从1顺时针报数,报至第m私房,再使得该
         出列,…,如此下去,  直到圆圈中只是残留一个丁收。此人就是为优胜者。

例如  n = 8   m = 3

 

1、数据(Data)

其三:栈和班

括号匹配的查:(栈)

假要于表达式中允许包含两种植括号:圆括号及方括号,其嵌套的相继随意,即:

([]())或[([ ][ ])]等啊是的格式,

[( ])或([( ))或 (()])均为不科学的格式。

虽然 检验括号是否匹配的不二法门可用“但愿的迫切程度”这个定义来叙述。

算法设计:

1)  凡出现左括弧,则进栈;

2)  凡出现右括弧,首先检查栈是否空

若果栈空,则表明该“右括弧”多余,

   否则和栈顶元素于,

     若相匹配,则“左括弧出栈” ,

     否则表明无匹配。

3)表达式检验完毕时,

   若栈空,则表明表达式中匹配正确,

   否则表明“左括弧”有余。

 

表达式求值:(栈)

迷宫求解:(栈)

请求迷宫路径算法的着力思想是:从入口出发,按某平等在为朝非走过的前沿探索

若当前职“可通”,则纳入路径,继续进步

要当前职务“不可通”,则退步,换方向持续追究;

倘四周“均无通路”,则将手上职务于路径中删除出去。

 

                            算法:

设定当前职的初值为进口位置;

 do{

   若当前职务可通,

   则{将眼前位置插入栈顶;

           若该岗位是张嘴位置,则算法结束;           

           否则切换时职的东邻方块为

                   新的当前位置;

   }

   否则 {

   }

}while (栈不空);

要是栈不拖欠都栈顶位置还有另外方向不为追,

则设定新的此时此刻位置为: 沿顺时针方向旋转

            找到的栈顶位置的生一样相互邻块;

要栈不空但栈顶位置的周围都不可通,

尽管{删去栈顶位置;// 从路径中删去该通道块                  

        若栈不空,则还测试新的栈顶位置,

        直至找到一个可通的交互邻块或出栈至栈空;

如果栈空,则表明迷宫没有通路。

 

 

库的另外一个重要的行使:递归调用

故此分治法求解递归问题:

分割治法:对于一个较复杂的题材,能够说变成几单相对简便易行的都解法相同或者近乎的子问题来求解

其三个规格:

1、能用一个问题变更成为一个新题材,而新题材同原来问题之解法相同或者近乎和,不同的光是处理的对象,且这些处理对象是生成来规律的

 

2、可以由此上述转化而要问题简化

 

3、必须有一个明白的递归出口,或称递归的疆界

 

分治法求解递归问题算法的相似式:

     void   p (参数表) {

        if   (递归结束条件)可直接求解步骤;—–基本项

        else  p(较小的参数);——归纳起

       }

long Fact ( long n ) {

    if ( n == 0) return 1;  //基本项

    else return n * Fact (n1);  //归纳项}

数是标世界信息的载体,它能够为电脑识别、存储和加工处理,是计算机程序加工的原料。计算机程序处理各种各样的数据,可以是数值数据,如整数、实数或复数;也堪是非数值数据,如字符、文字、图形、图像、声音相当。

四:串

 

 简单字符串模式匹配算法(BF算法):

算法思想:从主串S的第pos个字符起和模式串T的首先单字符比较的,若当,则连续于累字符;否则从主串的产一个字符起再重新与模式之字符比较的。依此类推,直至模式T中的每个字符依次和主串S中之一个连的字符序列相等,则称匹配成功,函数值为跟模式T中率先个字符相等的字符在主串S中序号,否则称匹配不成事,函数值为零星。

首尾字符串匹配算法:

事先比较模式串的第一个字符

再比模式串的最终一个字符

说到底比较模式串中由第二个顶第n-1个字符

 

Kmp算法:(难理解):复杂度o(m+n)

若设目标串(主串)为s,模式串为p
,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为1。若发生si=tj,则i和j分别加1。否则,i不变,j退回到j=next[j]的职务,再于si和tj,若当,则i和j分别加1。否则,i不变,j再次退到j=next[j]的职,依此类推,直至下列两栽可能:

     
一种植是j退及某某next[…]常字符比较等,则指针各自增1,继续进行匹配;

    
另一样栽是j退交价值吗零星(即模式的率先只字符“失配),则这需将模式延续往右侧滑动一个职,即从主串的一个字符si+1打与模式更开始匹配。

 

2、数据元素(Data Element)和数目项(Data Item)

五:数组和广义表:

累组,广义表是线性表的拓宽;

奇矩阵:

针对如矩阵:

上三角:

下三角:

 

对比赛矩阵:本着竞赛矩阵可按行优先顺序或针对角线的依次,将那缩减存储到

一维数组中,且为会找到每个非零元素和向量下标的应和关系。

疏散矩阵:

疏散因子:m行n列t个非零元素

 

 

顺序存储:三元组(行数,列数,元素值)

转置:

算法的核心思想:第一糟糕由转置前稀疏矩阵source中取出应该放置到转置后底稀疏矩阵dest中首先单职位的因素,行列号互换后,放于dest中率先只岗位;第二不成打source中甄选应该放权dest中之老二个职务的因素,……,如此进行,依次生成dest中之各级要素。

措施同样:按m的列序转置

按部就班T.data中三初组次序依次在M.data中找到相应的老三长组开展转置,即按矩阵M的列序来拓展交换。

啊找到M中每一样排有非零元素,需对其三最先组表M.data从第一行于扫描一全副。由于M.data中坐M行序为主序,所以经得到的刚是T.data中应该的各个。

艺术二:快速转置

据M.data中三首位组次序转置,转置结果放入T.data中得当位置。

本法关键是若预先确定M中每一样排列第一单非零元在T.data中职,为确定这些岗位,转置前许事先求得M的诸一样排列着莫零元个数。

链式存储:十配链表

 

 

 

广义表:(人工智能):

广义表可以当作是线性表的推广,线性表是广义表的特例。广义表的构造相当灵活,在某种前提下,它好兼容线性表、数组、树及产生于图等各种常用的数据结构。

A=(),B=(x, y, z),C=(B, y, z),D=(x,(y, z)),E=(x, E)

 

 

数据元素是数据的主干单位,在微机程序中一般被当一个完好进行考虑同处理。数据元素有时也于名元素、结点、顶点、记录等。一个数额元素而由于几独数据项(Data
Item)组成。数据项是不可分割的、含有独立意义的绝小数目单位,数据项有时也叫字段(Field)或域(Domain)。数据项分为寡栽,一种植叫做初等项,另一样种植名叫组合项。

六:树及二叉树

二叉树的性:

  1. 以二叉树第i重合到多生2i-1个结点
  2. 深也k的二叉树到多起2k-1个结点
  3. 对其它一样颗二叉树,如果其叶子数为n0,度也2底结点数为n2,则n0=n2+1
  4. 有n个结点的净二叉树的深度也(log2n)+1

充满二叉树的定义:

拟平:若二交叉树被不过多但发极下零星重叠发生度仅次于2的结点,且最好下层之结点都相继排在极其左边,则称此二叉树为完全二叉树。

法二:深度也k的二叉树,若第1到第k-1层为深度也k-1的满二叉树,第k层的结点都一一排列在最为左边,则称之二叉树为完全二叉树。

 

二叉树的储存:

         顺序:适合满二叉树和完全二叉树

         链式:二叉链表,三立交链表

特征:n个结点,有n+1单空指针域

二叉树的遍历:前序遍历,中序遍历,后序遍历(前中后是指根结点)

         实现:递归方法

                            非递归方法:用栈

 

         已清楚前序遍历和后序遍历不能够要出二叉树

 

头脑二叉树:

         目的:非线性结构 –> 线性结构

         先先后线索二叉树

         中先后线索二叉树

         后续线索二叉树

 

培育之贮存:

         双亲表示法

         孩子表示拟

         孩子兄弟表示法(常用)

 

树转二叉树:弟兄相连留长子

         特点:其右子树得也空

 

二叉树变树:左孩右右连老人,去丢原来右孩线

 

林变二叉树:树变二叉根本相并

 

二叉树变森林:失去丢满右手孩线,孤立二叉再恢复

 

塑造的遍历与二叉树遍历对应之涉嫌:

 

铸就:先序遍历,后序遍历

林:先序遍历,中序遍历

二叉树:先序遍历,中序遍历

 

Haffman树与Haffman编码:

         Haffman树最优树:带权路径长度(WPL)最缺的培养

         Haffman最美二交树:WPL最差的二叉树

 

         构造Haffman树:7 5 5 2 4

        

         Haffman编码:根据字符出现频率编码,使电文总长度最缺乏

 

         两只问题:

n个结点经n-1差合,每次酷成新的结点,总共
n+n-1=2n-1单结点,度也2之结点个数为n-1

 

并未度过为1底结点

 

 

3、数据对象(Data Object)

七:图

         无为图边的取值范围:0<=e<=n(n-1)/2

         有往图弧的取值范围:0<=e<=n(n-1)

 

         稀疏图:边数或弧数远点儿nlogn

         连通:甭管向图中,顶点到终端之间出路子

        

 

        
图的生成树:一个连通图(无向图),生成树是一个极端小并通子图,有图中全部n个顶点,n-1条边

 

         对于非连通图,每个连分量可以组织一粒大成树,从而构成森林

        
贪图结合森林:出于几蔸有于培训组成,会时有发生图中全部顶点,但仅发生可以构成若干蔸不交的有向树的弧

 

         图的囤:邻接矩阵,邻接链表,十许链表,邻接多重表,边表

 

         出往图的邻接矩阵:极的度 = 第i行元素之与 +
第j排列元素之和

 

         无向树的邻接矩阵:极限的度 = 第i行之要素 1 的个数

 

                   优点:容易实现图的操作 
缺点:空间效率呢o(n2

 

                   邻接表:效率o(n+e)

 

希冀的遍历:

         深度优先DFS:(Depth_First Search)

                   基本思维:仿树的中序遍历,分连通图和非连通图两近乎

         广度优先BFS:(Breadth First Search)

                   基本思想:仿树的层次遍历

 

         希冀的太小生成树

                  
生成树的代价:假如并通图是一个带权图,则该生成树中的限度也带权,生成树中有所边的权值之同名生成树的代价

                   极致小生成树MST(Minimun Spanning
Tree):
带权连通图中代价最小的生成树

 

                   组织最小生成树的不二法门:

①   Prim算法(以终端为目标),时间复杂度o(n2),适合稠密图

②   Kruskal算法(以边也目标),时间复杂度o(eloge),适合稀疏图

注意:最小生成树可能无唯

         产生往无环图及其使用:

                   有向无环图DAG:(Directed Acycling Graph)

                   拓扑排序:

①   在生于图选一个从未前人的终极且输出 (入度为0)

②   从图备受去除该终端及她的持有尾

③   重复以上两步

 

AOV网:顶表示活动的网(Activity On Vertex
network),不同意发生回路,弧表示活动之间的优先制约关系

检测AOV中是否是环:网中具有终端拓扑有序序列(拓扑序列不是绝无仅有的)

 

 

 

         第一路径:(Critical Path)

AOE网(Activity On Eage
network):
顶表示时间,弧表示活动,权表示活动持续的流年

        

要活动:该边上的权值增加将使有于图及的不过丰富路长度增加,l(i)=e(i)

 

探寻关键路径:必须找到关键活动

①   向前递推

②   向后递推

③   把l(i)=e(i)的门径连起来

 

 

         最缺少路径(Short Path):交通网络问题

 

                   分两栽:单源点最缺路径,所有终端最缺路径

 

                   单源点最短路径:

 

方同样:将源点到极限所有路径列出来,选最短缺的。缺点:随路径的增多,效率会回落

                           
方法二:Dijkstra算法:按照路径长度递增次序来各顶的无比差路径

 

                  各级一样针对极端间最缺少路径:

                           
方法一致:以一个顶为源点,重复执行Dijkstra算法N次,T(n)=o(n3)

                            方法二:Floyd算法:

琢磨:逐个顶点试探,从vi到vj的具备可能是路线中,选出一久长最缺乏的

                                     实现:

(1)初始时设置一个n阶方阵,令该针对性角线元素也0,若存在弧<Vi,Vj>,则针对应元素为权值,否则也∞。

(2)逐步尝试着在原先一直途径中长中顶点,若参加中间点后路径变短,则改的;否则,维持原值。

(3)所有终端试探完毕,算法结束。      

 

 

数对象是性相同之数元素的会师,是多少的一个子集。

八:查找

4、数据类型(Data Type)

静态表查找

平均查找长度ASL:(Average Search
Length):
为确定记录在表中的职,需要与给定值进行比较根本字的个数的只求值

评标准:ASL

逐一查找:(顺序或链式)

想想:从表中最后一个记录开始,逐个进行记录的基本点字与受定值的比,若有记录的要紧字和被定值比较等,则寻成功,否则查找无成功。

 

亏本半摸:(顺序)

                   效率比顺序查找高

 

 

数据类型是高档程序设计语言中之概念,是数码的取值范围和针对数据开展操作的总数。数据类型可分为两接近:一接近是勿组织的原子类型,如C#语言中的主干型(整型、实型、字符型等);另一样像样是结构类型,它的分可由多只布局类型组成,并可以讲。结构类型的分可是非结构的,也足以是结构的。

动态查找表

是重大字为key的记录,则回,否则插入

 

二叉排序树:(二叉查找树)

特点:

        i.   左子树有节点<根节点

       ii.   右子树有节点>根节点

       iii.   左右子树分别是二叉排序树

算法:

①   查找

②   插入:插入位置由查找过程获得

③   删除:(分三栽状态,定则:保持着先后序列不换)

a)   *p为叶子节点,只需要修改*P双亲*f的指针

b)   *P只有左子树要右子树

             i.  只出左子树:用*P的左孩子代替*p

             ii.   只发生右子树:用*p的右边孩子代替*p

c)         *p左右子树非空

         i.     用*P的直前驱取代*p

         ii.    用*p的第一手后继取代*p

         iii.    若*p的左子树无右子树,用*p左子树取代*p

 

含 n 个结点的二叉脱序树的平分查找长度及培育的貌有关 

极致好状态: ASL=log 2(n + 1) – 1;   
             树的深度为:log 2n  + 1;  
             与折半查找吃之判定树相同。
           (形态于均衡)。 

极端酷情况:插入的 n 个要素于同开始就是不变,

            —— 变成单支树的貌!

            此时培养之深度也 n;   ASL = (n + 1) / 2  

             查找效率与各个查找情况一样。

                  

 

抵二叉树(AVL树):

性质:

①   左右子树是平衡二叉树

②   所有节点的左右子树深度的异的绝值仅次于等于1

 

节点平衡因子:该节点左子树和右子树的深度不同

 

结构平衡二叉树:

         LL平衡旋转:(B为轴,顺时针旋转)

                    RR平衡旋转:(B为轴,逆时针旋转)

                    LR平衡旋转:(c为轴,先逆时针转动,后顺时针旋转)

                    RL平衡旋转:(c为轴,先顺时针旋转,后逆时针转动)

 

B-树:

 

 B+树:

 

 

  散列表:

 特点:ASL=0,不欲经过比

 

哈希表:根据设定的哈希函数H(key)和所选中的处理闯的不二法门成立的查找表

 

思考:以记录的重点字为自变量,根据哈希函数计算起相应的哈希地址,并当此存储该记录之始末

 

组织哈希函数的主意:

本着数字:直接定值法,数字分析法,随机数法

平方取中法(常用),折叠法,除留与余数法(最常用H(key)=key MOD p
p<=m,p为<m的素数或无包含20以下质因子的合数)

匪数字:先进行数字化处理

 

处理冲突之不二法门:

①   开放定址法:当发生冲突,在冲位置前后附近寻找可以存放记录的悠闲单元

H0=H(key)

Hi=(H(key)+di) MOD m i=1,2….

Di有三栽模拟:

a)  线性探测再散列  ,di = 1,2,….

b)  二不良探测再散列(平方),di = 12 -12
22 -22

c)  为擅自探测再散列(双散列函数探测再散列)

 i.  Di=伪随机数列 或者 di = i×H2(key)

②  链地址开方法(开域法):将所有哈希值相同之笔录都总是于一如既往链表中

 

 

 

5、数据结构(Data Structure)

九:排序

评标准:执行时,辅助空间,算法稳定性

 

其中排序:

①   插入排序

a) 直接插入排序

b) 希尔排序

  i.  
 思想:将整个待排序记录分割成多个子序列,在子序列内分别展开直接插入排序,待全部序列中的笔录基本板上钉钉时,对全体记录进行直接插入排序。

②   交换排序

a)  冒泡排序

b)  快速排序

 i. 思想:
首先选择一个轴值(即于的尺度),通过同样水排序将待排序记录分割成独立的少数组成部分,前一部分记下的重中之重码均小于或顶轴值,后同样有的记录的重要码均大于或等轴值,然后分别对就点儿片重新上述措施,直到整个序列有序。

③   选择排序

a)简单选择排序(直接选择排序)

b)堆排序(改进:查找最小码的以,找来比较小价,分殊根堆,小根堆)

④   由并排序

a)
二路程归并排序:将一个具n个待排序记录的排看成是n个长也1之稳步序列,然后开展简单点滴由并,得到n/2独长也2之静止序列,再进行简单简单归并,得到n/4独长为4底平稳序列,……,直至获得一个长度为n的静止序列为止。

⑤   基数排序

a) 多重要字排序

  i.  最高位优先MSD法

  ii.  最低位优先MSD法

b) 链式基数排序

c)基数排序的年月复杂度为O(d(2n+r))

其中:分配为O(n)

收集为O(n+r)(r为“基”)

 d为“分配-收集”的趟数

 

 

外表排序:外排总的时空还承诺包括中排序所用时间与逐趟归并不时展开内统一的工夫

 

讨论:

日复杂度:

①   平均时间性能:

a)时间复杂度为 O(nlogn):快速排序、堆排序和联排序

b) 时间复杂度为 O(n2):直接插入排序、起泡排序和概括选择排序

c)时间复杂度为 O(n):基数排序

②   排元素序列按重要性字顺序有序

a)  直接插入排序能达到O(n)的年华复杂度, 快速排序的流年性能蜕化为O(n2)

③   排序的岁月性能不以关键字分布而变更之排序

a)  
简单选择排序、起泡排序、堆排序和联合排序的时空性能不依照元素序列中重要字之分布而变更

 

安居之排序方法指的是,对片只基本点字当的元素,它们当班中的对立位置,在排序前和经过排序之后,没有改观。

 

 

 

 

 

数据结构是相有一样种植要多一定关系之多寡元素的聚集。在旁问题遭到,数据元素中都未是孤立的,而是在正在自然之关联,这种关涉称为组织(Structure)。根据数量元素中涉及的不比特点,通常有4类基本数据结构:
(1) 集合(Set);(2) 线性结构(Linear Structure);(3) 树形结构(Tree
Structure);(4) 图状结构(Graphic Structure)。

数据结构的形式化定义为: 数据结构(Data
Structure)简记为DS,是一个二元组, DS = (D,R)
其中:D是数据元素的片集合, R是数量元素中涉及的有数集合。

数据结构包括数据的逻辑结构和物理结构。数据的物理构造以称为存储结构(Storage
Structure),是数量在微机被的象征(又叫映像)和存储,包括数据元素的意味和储存和数元素中关系之表示和仓储。

数据的贮存结构包括顺序存储结构与链式存储结构简单栽。顺序存储结构(Sequence
Storage
Structure)是经数据元素以处理器存储器中的相对位置来表示来数元素的逻辑关系,一般将逻辑上附近的多寡元素存储在情理位置紧邻之存储单元中。在C#语言中之所以数组来贯彻顺序存储结构。因为数组所分配的存储空间是连连的,所以数组天生就具有实现数量顺序存储结构的力量。链式存储结构(Linked
Storage
Structure)对逻辑上相邻之数元素不要求其储存位置必须相邻。链式存储结构中之数码元素称为结点(Node),在结点中附设地址域(Address
Domain)来囤和拖欠结点相邻之结点的地址来兑现结点间的逻辑关系。这个地方称为引用(Reference),这个地址域称为引用域(Reference
Domain)。

  1. 算法

自从上节咱们理解,算法和数据结构和次序的干坏密切。进行次设计时,先确定相应的数据结构,然后又冲数据结构和问题之需统筹相应的算法。由于篇幅所限,下面仅由算法的特征、算法的评价标准及算法的辰复杂度等三个点拓展介绍。

1.2.1算法的特色

算法(Algorithm)是本着某个平一定项目的题目的求解步骤的相同栽描述,是令的有限序列。其中的各个条指令表示一个还是多个操作。一个算法应该负有以下5单特色:

1)、有穷性(Finity):一个算法总是以尽有穷步之后了,即算法的履行时间是少的。

2)、确定性(Unambiguousness):算法的每一个手续都必有适当的意义,即无论是二义,并且于同一之输入只能发出一致的输出。

3)、输入(Input):一个算法有零个或多只输入。它就凡当算法开始前给来底计量。这些输入是某个数据结构中的数额对象。

4)、
输出(Output):一个算法有一个还是多个出口,并且这些输出及输入之间在着某种特定的涉嫌。

5)、
能行性(realizability):算法中的诸一样步都得透过已落实之核心运算的简单次运行来促成。

算法的意思和程序非常相像,但二者有分。一个先后不自然满足来穷性。例如操作系统,只要一切体系未吃损坏,它以永远不见面终止。还有,一个顺序只能用电脑语言来描述,也就是说,程序中之命令须是机器而实施的,而算法不自然用微机语言来描述,自然语言、框图、伪代码都可以描述算法。

  1. 算法的日子复杂度

一个算法的时光复杂度(Time
Complexity)是指该算法的运行时及问题规模之呼应关系。一个算法是由于控制结构和本操作成的,其实施的日在双方的概括力量。

  1. 集的定义

会师(Set)是由于一些确定的、彼此不同的分子(Member)或者元素(Element)构成的一个完好。成员取得自一个再度老的界定,称为基类型(Base
Type)。集合中成员的个数称为集合的基数(Cardinality)。集合的每个成员或是基类型的一个中坚要素(Base
Element),或者其本身也是一个汇。我们把是汇的成员叫该集的子集(Subset),子集中的每个成员还属于该集。没有元素的集纳称为空集(Empty
Set,又曰Null Set),记作Φ。

聚拢的特色

1) 确定性:任何一个目标都能于正好地判断是聚众中的因素或非是;

2) 互异性:集合中的元素不可知更;

3) 无序性:集合中元素与各个无关。

  1. 递归

一个算法调用自己来好她的片段工作,在缓解一点问题时常,一个算法需要调用自身。如果一个算法一直调用自己要间接地调用自己,就称此算法是递归的(Recursive)。根据调用方式的差,它分成直接递归(Direct
Recursion)和间接递归(Indirect Recursion)。

  1. 接口

1)、 接口的概念

接口(Interface)定义为一个约定,实现接口的近乎还是组织要遵从该约定。简单的游说,接口是近乎里互相时严守的一个商。这种用一个目标看成多独品种的力一般如作多延续(Multiple
Inheritance)。通用语言运行时(CLR)支持但实现持续与多接口继承。单实现连续(Single
Implementation
Inheritance)是据一个品种只能有一个基类型。多接口继承(Multiple Interface
Inheritance)是赖一个色可以继承多只接口,而接口是类似中彼此交互的一个华而不实(Abstract),把看似里要彼此的内容空虚出定义成接口,可以重新好地控制类之间的逻辑交互。

接口就含有成员定义,不含有成员的落实。接口不见面继续自任何的System.Object派生类型。接口就是一个饱含着同组虚方法的架空类型。成员的落实用以此起彼伏的接近或组织面临落实。接口的成员包静态方法、索引器、常数、事件与静态构造器等,不包含其他实例字段或实例构造器,所以,不可知实例化一个接口。
实现接口的切近必须严厉按照其定义来落实接口的每个成员。

  1. 接口及抽象类

虚幻类(Abstract
Class)和接口在概念及力量及闹为数不少一般之地方,在程序中挑选采取抽象类还是接口需要比较抽象类和接口之间的切实可行差异。
抽象类是同一种植不能够实例化而得从中继承的类,抽象类可供实现,也可免提供实现。子类只能打一个抽象类继承。抽象类应重点用来关系密切的靶子。如果如设计很的功力单元或创办组件的大半独本子,则运用抽象类。
接口是一心空虚的积极分子会合,不提供实现。类或组织可以连续多只接口。接口最适合啊未相干的接近提供通用功能。如果要规划小若精炼的意义块,则使用接口。接口一旦创立就非可知改,如果欲接口的新本子,必须创造一个全新的接口。

  1. 泛型编程

泛型(Generic Type)是.NET Framework
2.0尽强劲的功效。泛型的重要考虑便是拿算法和数据结构完全分离开来,使得一样次定义的算法能够作用被多数量结构,从而实现高度可选用的付出。通过泛型可以定义类型安全之数据结构,而从不必要采取实际的数据类型。这将明确增强性能并赢得重新胜似质量之代码,因为可以选用数据处理算法,而没必要复制类型特定的代码。

(1) 性能问题。(2) 类型安全。(3) 工作效率。

  1. 泛型的功利

泛型使代码可以引用,类型和内部数据好当不招代码膨胀的情景下转,而不论是是值类型还是引用类型。可以一次性地付出、测试与布局代码,通过外类型(包括未来底色)来还用它们,并且布满有着编译器支持和种安全。因为泛型代码不会见粗暴对值类型进行装箱和撤回装箱,或者对援类型进行向下强制类型转换,所以性能得到明显增强。对于值类型,性能一般会增高200%;对于引用类型,在访该档时,可以预想性最好多提高100%(当然,整个应用程序的性质可能会见增强,也或无会见加强)。

第2章

  1. 线性表

线性表是极简单易行、最核心、最常用的数据结构。线性表是线性结构的悬空(Abstract),线性结构的特征是组织中的数码元素中是一定底线性关系。这种一对一的涉及因的是数元素中的职关系,即:(1)除第一独岗位的数据元素外,其它数据元素位置的面前都只是发生一个数量元素;(2)除最后一个职的数目元素外,其它数据元素位置的后边都止发一个因素。也就是说,数据元素是一个联网一个的排。因此,可以管线性表想象吧同一栽多少元素序列的数据结构。

  1. 线性表的定义

线性表(List)是由n(n≥0)个同档次的多少元素做的个别序列。对于这个定义应该小心少个概念:一凡“有限”,指的凡线性表中的数元素的个数是少数的,线性表中的各国一个数码元素都发出和好之职务(Position)。二凡是“相同类别”,指的凡线性表中的多少元素都属同一栽类型。

  1. 顺序表的概念

于微机内,保存线性表最简单易行、最当之法,就是把表中的因素一个接一个地拓宽上顺序的存储单元,这便是线性表的顺序存储(Sequence
Storage)。线性表的顺序存储是凭以内存中用一片地方连续的长空依次存放线性表的数元素,用这种方式囤的线性表叫顺序表(Sequence
List),顺序表的性状是表中相邻之数码元素于内存中储存位置为紧邻。

  1. 链式存储 (Linked Storage)

如此这般的线性表叫链表(Linked
List)。链表不求逻辑上附近之数目元素于物理存储位置上也紧邻,因此,在对链表进行扦插和去时不需要走数据元素,但同时也错过了各个表而随便存储的独到之处。

  1. 链表

大凡因此同一组随机的存储单元来存储线性表中的数目元素(这组存储单元可以是接连的,也得以是匪总是的)。

点滴组成部分信息做该数量元素的储存映像(Image),称为结点(Node)。把仓储据元素本身信息的域叫结点的数据域(Data
Domain),把仓储和它附近之数额元素的囤积地点信息的域叫结点的引用域(Reference
Domain)。因此,线性表经过每个结点的引用域形成了同等绝望“链条”,这就是是“链表”名称的由于来。

如若结点的引用域只存储该结点直接后继结点的囤地点,则该链表叫单链表(Singly
Linked List)。

老三段 栈和行

库房和班是可怜主要的简单种植多少结构,在软件设计中行使很多。栈和排也是线性结构,线性表、栈和班这三种植多少结构的多少元素与数额元素中的逻辑关系完全相同,差别是线性表的操作不被限制,而仓库和行的操作着限制。栈的操作只能在表的一样端进行,队列的插入操作在表的一律端进行而另操作在表的别样一样端进行,所以,把库房和班称为操作受限的线性表。

栈分为顺序栈和链栈。顺序栈用数组表示,链栈使用单链来表示,是单链的一模一样种植简化。

  1. 队列

行(Queue)是插操作限定在表的尾巴而其余操作限定在表的脑壳进行的线性表。把开展插队操作的表尾称为队尾(Rear),把开展其它操作的头部称为队头(Front)。当对列中尚无数元素时名叫空对列(Empty
Queue)。

队通常记为:Q=
(a1,a2,…,an),Q是英文单词queue的第1单字母。a1为帮头元素,an为队尾元素。这n个要素是依照a1,a2,…,an的次序依次入队的,出对的次第与入队相同,a1首先单出队,an最后一个出队。所以,对列的操作是遵循先进先出(First
In First Out)或后上后产生( Last In Last
Out)的口径开展的,因此,队列又称为FIFO表或LILO表.

认清队空的基准是:rear==front,判断队满之准绳是:(rear + 1) %
maxsize==front。求循环队列中数据元素的个数可由(rear-front+maxsize)%maxsize公式求得。

队尾指示器的加1操作修改也: rear = (rear + 1) % maxsize

队头指示器的加1操作修改也: front = (front + 1) % maxsize

2.1链队列

列的另外一栽存储方是链式存储,这样的阵称为链队列(Linked
Queue)。同链栈一样,链队列通常用单链表来表示,它的落实是只是链表的简化。所以,链队排的结点的构造与单链表一样.

二叉树(Binary
Tree)是n(n≥0)个一律档次的结点的点滴集合。n=0的二叉树称为空二叉树(Empty
Binary Tree);对于n>0的即兴非空二叉树有:

(1)有且仅发生一个特的结点称为二叉树的到底(Root)结点,根没有前人结点;

(2)若n>1,则除外根结点外,其余结点被分成了2单互不相交的集合TL,TR,而TL、TR我又是平等棵二立交树,分别叫这棵二叉树的左子树(Left
Subtree)和右子树(Right Subtree)。

(1)满二叉树(Full Binary
Tree):如果相同株二叉树只有度为0的结点和过也2的结点,并且度为0的结点在平层及,则马上株二立交树也满载二叉树,对于深度为k的充满二叉树的结点个数为2k-1。

(2)完全二叉树(Complete Binary
Tree):深度也k,有n个结点的二叉树当且仅当其列一个结点都跟深也k,有n个结点的充满二叉树被编号从1交n的结点一一对应时,称为了二叉树,完全二叉树的特点是纸牌结点只或出现在层次太要命的简单重叠及,并且有结点的左分支下子孙的极其老层次以及右分支下子孙之极端深层次等或大1。

3.1二叉树的性能

属性1 一株非空二叉树的第i重叠及最多发生2i-1个结点(i≥1)。

性2
若规定空树的吃水为0,则深度也k的二叉树最多来2k-1个结点(k≥0)。

性能3 具有n个结点的了二叉树的深度k为log2n+1。

特性4
对于同蔸非空二叉树,如果度为0的结点数目也n0,度为2底结点数目也n2,则有n0=
n2+1。

特性5
对于有所n个结点的全二叉树,如果按从上到下和从左到右的各个对具备结点从1开编号,则于序号为i的结点,有:

(1)如果i>1,则序号为i的结点的养父母结点的序号为i/2(“/”表示整除);如果i=1,则该结点是根结点,无大人结点。

(2)如果2i≤n,则该结点的左孩子结点的序号为2i;若2i>n,则该结点无不当孩子。

(3)如果2i+1≤n,则该结点的右孩子结点的序号为2i+1;若2i+1>n,则该结点无右孩子。

3.2 二叉树遍历

1、先序遍历(DLR)

预先先后遍历的中坚思想是:首先走访根结点,然后先序遍历其左子树,最后先序遍历其右子树。

2、中序遍历(LDR)

中序遍历的为主考虑是:首先被程序百分之百历根结点的左子树,然后访问根结点,最后中序遍历其右子树。

3、后序遍历(LRD)

后先后遍历的中坚考虑是:首先后先后全勤历根结点的左子树,然后后先后全方位历根结点的右子树,最后访问根结点。

4、层序遍历(Level Order)

层序遍历的主干考虑是:由于层序遍历结点的顺序是预先撞的结点先看,与队列操作的相继相同。所以,在进行层序遍历时,设置一个阵,将干净结点引用入队,当行非空时,循环执行以下三步:

(1) 从队列中取出一个结点引用,并走访该结点;

(2) 若该结点的左子树非空,将欠结点的左子树引用入队;

(3) 若该结点的右子树非空,将欠结点的右子树引用入队;

5.4哈夫曼树

5.4.1哈夫曼树的基本概念

首先让出定义哈夫曼树所要用到之几乎独基本概念。

(1)路径(Path):从培养被的一个结点到另外一个结点之间的支行组成这简单独结点间的门道。

(2)路径长度(Path Length):路径上的分支数。

(3)树的途径长度(Path Length of
Tree):从树的根结点到每个结点的门径长度的同。在结点数目相同之二叉树中,完全二叉树的路长度最短。

(4)结点的权(Weight of
Node):在部分采用被,赋予树中结点的一个发出实际意义的再三。

(5)结点的带权路径长度(Weight Path Length of
Node):从该结点到培养的根结点的门径长度以及拖欠结点的权的乘积。

(6)树之带权路径长度(WPL):树被装有叶子结点的带权路径长度的与,记否

Σ==n1kk.kWPLLW

其中,Wk也第k只叶子结点的权值,Lk为第k独叶子结点的门径长度。在祈求5.17(a)所出示之二叉树中,结点B的门路长度为1,结点C和D的门道长度也2,结点E、F和G的路线长度为3,结点H的路子长度也4,结点I的路子长度为5。该树的不二法门长度为:1+2*2+3*3+4+5=23。如果结点B、C、D、E、F、G、H、I的且分别是1、2、3、4、5、6、7、8,则这些结点的带权路径长度分别是1*1、2*2、2*3、3*4、3*5、3*6、4*7、5*8,该树的带权路径长度为3*5+3*6+5*8=73。

这就是说,什么是哈夫曼树呢?

哈夫曼树(Huffman
Tree),又给最出彩二交叉树,指的是对同组有确定权值的纸牌结点的备极其小带权路径长度的二叉树。

哈夫曼算法。现叙述如下:

(1)根据加的n个权值{w1,w2,…,wn},构造n棵只有根结点的二叉树集合F={T1,T2,…,Tn};

(2)从集合F中挑选两蔸根结点的权最小的二叉树作为左右子树,构造一棵新的二叉树,且购置新的二叉树的根结点的权值为夫荒谬、右子树根结点权值之和。

(3)在集合F中剔除这有限蔸树,并拿新收获的二叉树加入到集合F中;

(4)重复上述手续,直到汇中只是生一致棵二叉树为止,这棵二立交树就是哈夫曼树。

树形结构是一样种异常重大之非线性结构,树形结构面临之数额元素称为结点,它们中是一致对准多之关联,既出层次关系,又来分关系。树形结构来栽培及二叉树两种植。

养是递归定义之,树由一个根结点和多少株互不相交的子树构成,每株子树的组织及培育相同,通常树指无序树。树之逻辑表示日常有四栽方法,即直观表示法、凹入表示拟、广义表表示法和嵌套表示拟。树的积存方发出3栽,即上下表示拟、孩子链表表示法和子女兄弟表示法。

二叉树的定义为是递归的,二叉树由一个根结点和一定量蔸互不相交的子树构成,每株子树的布局以及二叉树相同,通常二叉树指有序树。重要的二叉树生满二叉树和全二叉树。二叉树的习性要出5漫漫。二叉树的底存储结构主要发生三种植:顺序存储结构、二叉链表存储结构和三叉链表存储结构,本书给有了亚交链表存储结构的C#心想事成。二叉树的遍历方式一般发生四栽:先序遍历(DLR)、中序遍历(LDR)、后序遍历(LRD)和层序遍历(Level
Order)。

林是m(m≥0)棵树的集。树、森林与二叉树的中可展开互转换。树的遍历方式产生先先后遍历和后序遍历两种植,森林的遍历方式有先先后遍历和中序遍历两栽。

哈夫曼树是同等组有确定权值的纸牌结点的备无比小带权路径长度的二叉树。哈夫曼树可用于缓解最优化问题,在多少通信等世界采取很广泛。

1、直观表示法

它象日常生活中的木一样。整个图虽象一棵倒立的扶植,从根结点出发不断扩大,根结点在极其上层,叶子结点当极端下。

2、凹入表示法

每个结点对应一个矩形,所有结点的矩形都右对旅,根结点用极丰富的矩形表示,同一层的结点的矩形长度相同,层次越强,矩形长度逾亏。

3、广义表表示法

据此广义表的花样表示根结点排在极其前头,用同一对准圆括哀号将其的子树结点括起,来,子树结点用逗号隔开。树之广义表表示如下:

(A(B(E,F,G),C(H),D(I,J)))

4、嵌套表示法

恍如数学中所说的文氏图表示法。

6 图

图状结构简称图,是其他一样种非线性结构,它于树形结构还扑朔迷离。树形结构被的结点是相同对多之关联,结点间拥有显著的层次以及支行关系。每一样交汇的结点可以同生同样重叠的基本上独结点相关,但不得不与落得亦然叠的一个结点相关。而贪图被的极限(把图中之数元素称为顶点)是差不多对几近的关系,即至点间的涉是任意的,图中自由两单终端之间都可能系。也就是说,图的终端之间无明确的层系关系,这种干在现实世界面临大量存在。

鉴于最小生成树的定义可知,构造出n个顶点的无论是为连通网的绝小生成树必须满足以下三单原则:

(1)构造之极其小生成树必须概括n个顶点;

(2)构造之极端小生成树生还仅发生n-1条边;

(3)构造的不过小生成树中未存在回路。

布局最小生成树的办法来为数不少种植,典型的点子发生个别种,一种是普里姆(Prim)算法,一栽是克鲁斯卡尔(Kruskal)算法。

2.普里姆(Prim)算法

倘G=(V,E)为同一无论往连通网,其中,V为网中极的联谊,E为网中边的联谊。设置两只新的集合U和T,其中,U为G的不过小生成树的顶的成团,T为G的无比小生成树的边的集纳。普里姆算法的思维是:令集合U的初值为U={u1}(假设构造最小生成树时由顶点u1发端),集合T的初值为T={}。从具有的顶点u∈U和极v∈V-U的带权边吃选出具有无比小权值的限(u,v),将顶点v加入集合U中,将限(u,v)加入集合T中。如此不断地还直到U=V时,最小生成树构造完毕。此时,集合U中存放着极其小生成树的有所终端,集合T中存放着极度小生成树的有着边。

3.克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法的核心思维是:对一个发n个顶点的凭往连通网,将图备受之尽头按权值大小顺序选择,若选择的无尽设生成树不形成回路,则将它们参加到培养被;若形成回路,则用她舍弃。如此进行下去,直到树被确保含有n-1条边为止。

脚是拓扑排序算法的叙述:

(1)在起于图备受甄选一个入度为0的终点(即无前人的顶),由于该顶点没有外先决条件,输出该终端;

(2)从图被剔除所有坐它们也尾的弧;

(3)重复执行(1)和(2),直到找不顶入度为0的极端,拓扑排序完成。

若是图被按照有极端存在,却没有入度为0的顶,说明AOV网中出环路,否则没有环路。

由堆的定义可知,堆有如下两只属性:

(1)最充分堆的根结点是积中关键码最要命的结点,最小堆的根结点是积着关键码最小的结点,我们称堆的根结点记录也堆顶记录。

(2)对于极端特别堆,从根结点到每个叶子结点的路上,结点组成的行列都是递减有序的;对于极端小堆,从根结点到每个叶子结点的路线上,结点组成的班都是与日俱增有序的。

堆积如山排序的经过是:设有n个记录,首先以立刻n个记录按关键码建成堆,将堆顶记录输出,得到n个记录受关键码最酷(或顶小)的笔录。然后,再将剩余的n-1单记录,输出堆顶记录,得到n个记录着要码次大(或二流稍)的记录。如此反复,便可得到一个以重要性码有序的行列。

故而,实现堆排序需解决个别独问题:

(1)如何以n个记录的队按关键码建成堆;

(2)输出堆顶记录后,怎样调整剩下的n-1个记录,使其据重要性码成为一个新堆。

排序是计算机程序设计中的同等种重大操作,

化为仍记录的某部关键码有序的队列的进程。排序方法按涉嫌的存储器不同分为内排序和表面排序两近乎。内部排序指记录存放在内存中并且以内存中调整记录里的对立位置,没有外、外存的数据交换。外部

存中,借助于内存调整记录中的相对位置,需要在内、外存之间交换数据。排序方

稳定排序方法在排序前后相同关键码值的笔录里的职位关系匪转换,不平静排序方法在排序前后相同关键码值的笔录里的岗位关系转移。本章主要介绍了常用之内部排序方法,包括三种植简单排序方法,即直接插入排序、冒泡排序和简易选择排序,这三种排序方法在最为好状态下的工夫复杂度为O(n),在平均情况下与最好充分情况下的日子复杂度都也O(n2),并且都是平稳的排序方法。

快捷排序方法的平均性最好,时间复杂度为O(nlog2n),所以,当待排序序列已经照重要性码随机分布时,快速排序是最为契合之。但很快排序在最为可怜情况下的时空复杂度是O(n2)。快速排序方法是休安静之排序方法

堆积如山排序方法在无限好状态下、平均情况下及极酷情况下的年月复杂度不见面发生变化,为O(nlog2n),并且所要的支援空间少快速排序方法。堆排序方法吧是未安静之排序方法。
归并排序方法在太好状态下、平均情况下及极致深情况下的时间复杂度不见面发生变化,为O(nlog2n),但需之扶空间大于堆排序方法,但由并排序方法是平稳之排序方法。
以上排序方法还是由此记录关键码的比和著录之走来进展破序.

相似景象下,排序都使顺序存储结构(基数排序方法除外),而当记录非常多时可下链式存储结构,但很快排序和堆排序却大不便在链表上实现。