程序员基础内功夯实——数据结构篇

结构并不固定和死板,应该在实际情况中做最贴切的设计和应用,意思就是咱怎么高兴怎么用,个人认为数据结构重要,但是更重要的是实现结构的算法,不能知其然,不知其所以然。

数据结构和算法参考(算法和数据结构—最全讲解 - 知乎)

堆栈C语言可以参考(内存堆和栈的区别 - Rick.lz - 博客园)

B树的分析可以参考(B树详解 数据与结构_A_Bo的博客-CSDN博客_b树)

本篇学习为主,参考很多,也有自己理解,参考无法一一列出请见谅。

数据结构=逻辑结构+存储结构+(在存储结构上的)运算/操作

一个结构可以分为数据结构和实现结构的算法,在定义好数据结构后,可能有多中方式可以实现(在存储结构上的)运算/操作,每一种方式就是一种算法,从而实现对于目标场景使用的数据处理的最优解。

数据的逻辑结构

线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。

树状结构:除了一个数据元素(元素 01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后续元素。

网络结构(图):每个数据元素可以有多个直接前驱元素,也可以有多个直接后续元素。特点是数据元素之间是多对 多 的联系

数据的存储结构

顺序存储结构:把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。

链式存储结构:数据元素的存储对应的是不连续的存储空间,每个存储节点对应一个需要存储的数据元素。每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的链接关系反映。逻辑上相邻节点物理上不必相邻。

索引存储结构:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

散列存储结构:根据结点的关键字直接计算出该结点的存储地址,比如Java中的HashSet、HashMap底层就是散列存储结构。这是一种神奇的结构,添加、查询速度快。

数据结构基础:

        线性表: 

        线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列

        线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

        数组:

        数组(Array)是有序的元素序列。 [1]  若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 [1]  这些有序排列的同类数据元素的集合称为数组。

        数组是用于储存多个相同类型数据的集合。数组不一定是线性表,具体看实现,分类很多:是否可变长,静态数组,动态数组等。

        队列:

        队列(queue)简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

        队列中把插入数据元素的一端称为 队尾(rear),删除数据元素的一端称为队首(front)。

        向队尾插入元素称为 进队或入队,新元素入队后成为新的队尾元素;从队列中删除元素称为离队或出队,元素出队后,其后续元素成为新的队首元素。

        由于队列的插入和删除操作分别在队尾和队首进行,每个元素必然按照进入的次序离队,也就是说先进队的元素必然先离队,所以称队列为 先进先出表(First In First Out,简称FIFO)。

        也有其他形式的受限队列,例如:双端队列,其中也分受限方式等等,以为着数据结构并不固定,只是对常见的结构进行总结归纳。

        栈:

        栈(stack )又称堆栈,它是运算受限的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。

        表中进行插入、删除操作的一端称为 栈顶(top),栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底(bottom)。

        当栈中没有数据元素时称为空栈;向一个栈插入元素又称为 进栈或 入栈 push;从一个栈中删除元素又称为 出栈或 退栈 弹栈 pop。

        由于栈的插入和删除操作仅在栈顶进行,后进栈的元素必定先出栈,所以又把堆栈称为 后进先出表(Last In First Out,简称 LIFO)

        堆和栈和内存:(结合下面堆一起看)

        数据结构中的,栈就像装数据的桶或箱子,堆像一棵倒过来的树。堆栈在计算机中是一个重要概念,所以不得不说到内存分配中的栈和堆。是一个内存区域,用于不同数据的存储。例如下面是C语言程序内存分配中的堆和栈图解:

        链表:

        链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。线性链表有:单向链表、双向链表、循环链表,非线性的参考下面的:二叉链表,三叉链表等

        单向链表:

        单向链表是对于线性结构的链式储存,如果有疑问可以先仔细了解区分一下上面的:逻辑线性结构和储存顺序结构,以及储存链式结构

        双向链表:

        当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表

        在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

        循环链表:

        循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

        散列表:

        散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

        散列函数:

        散列函数,顾名思义,它是一个函数。如果把它定义成 hash(key) ,其中 key 表示元素的键值,则 hash(key) 的值表示经过散列函数计算得到的散列值。构造哈希函数主要需要注意:

        ⑴构造一个合适的哈希函数

        均匀性 H(key)的值均匀分布在哈希表中;

        简单,以提高地址计算的速度

        ⑵冲突的处理

        冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。即关键字K1≠K2,但H(K1)= H(K2)。均匀的哈希函数可以减少冲突,但不能避免冲突。发生冲突后,必须解决;也即必须寻找下一个可用地址。

        哈希函数需要均匀且高效简单的计算映射的算法,在保持哈希特性下,哈希冲突不可避免,因为哈希实现映射是将一个大集通过哈希算法映射到小集中,在普适且维持哈希特性情况下不如会出现冲突,且没有冲突的话那为何还有需要进行映射?何不直接使用本身值?所以处理冲突是必须的,解决冲突一般分为两种方法:开发定址法和链地址法。

        开发定址法:大概意思是在发生冲突后进行在数组中寻找下一个空余位置进行定址插入。寻找下一个空地址方法就很多了,例如:多重散列方法,线性探测方法,二次探测方法等

        链地址法:大概意思是在发生冲突后在冲突地址位置进行链表方式挂上,典型:hashMap

常见的散列函数

1. MD5

MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一,主流编程语言普遍已有 MD5 实现。

将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5 的前身有 MD2 、MD3 和 MD4 。

MD5 是输入不定长度信息,输出固定长度 128-bits 的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个 128-bits 散列

基本方式为,求余、取余、调整长度、与链接变量进行循环运算,得出结果。

MD5 计算广泛应用于错误检查。在一些 BitTorrent 下载中,软件通过计算 MD5 来检验下载到的碎片的完整性。

2. SHA-1

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

SHA-1 曾经在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5的后继者。

     树:   

        树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。

        父子关系在树的结点之间建立了一个层次结构。

        树的结点包含一个数据元素及若干指向其子树的若干分支。

        在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。

        树(tree )是 n(n ≥ 0)个结点的有限集

        结点的度与树的度:

                结点拥有的子树的数目称为结点的 度(Degree)。

                度为0的结点称为叶子(leaf )或终端结点。

                度不为 0 的结点称为 非终端结点或 分支结点。

                除根之外的分支结点也称为内部结点。

                树内各结点的度的最大值称为树的度。

        二叉树:红黑树(有序二叉树 左小右大)

        每个结点的度均不超过 2 的有序树,称为 二叉树(binary tree) 。

        二叉树中每个结点的孩子数只能是 0、1 或 2 个,并且每个孩子都有左右之分

        位于左边的孩子称为左孩子,位于右边的孩子称为右孩子

        以左孩子为根的子树称为左子树,以右孩子为根的子树称为右子树

        二叉树中,每层结点都达到最大数,即每层结点都是满的,称为满二叉树

        在一棵满二叉树中,在最下层从最右侧起去掉相邻的若干叶子结点,得到的二叉树即为完全二叉树

        二叉树存储结构有两种:顺序存储结构和链式存储结构。更多使用链式存储结构

        树的顺序存储一般是用来存储满二叉树或者完全二叉树的,如果用来存储一般的二叉树会有空间浪费。

        所以一般储存用链式结构,设计不同的结点结构可构成不同的链式存储结构。

        在二叉树中每个结点都有两个孩子,则可以设计每个结点至少包括 3 个域:数据域、左孩子域和右孩子域,利用此结点结构得到的二叉树存储结构称为二叉链表。

        为了方便找到父结点,可以在上述结点结构中增加一个指针域,指向结点的父结点,采用此结点结构得到的二叉树存储结构称为三叉链表。

preview​​

二叉查找/搜索/排序树 BST (binary search/sort tree):

在二叉树基础上,进行添加限定规则。

(1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;

(2)若它的右子树上所有结点的值均大于它的根节点的值;

(3)它的左、右子树也分别为二叉排序树。

就是以中间节点为基准,进行大小判断,小的放左边,大的放右边的二叉树。

​​

相当于做了一个二分排序,以第一个加入的节点为根节点,进行以树的方式储存。

有一定好处,也有不足,比如最好情况下,根节点恰好是有序集合的中间值(平衡二叉树),效率就很高,如果最坏情况,如同上面第三图,加入的值恰巧都是同一方向的大或小,如果查询比较次数将是N。所以有平衡二叉树。

平衡二叉树(Self-balancing binary search tree): 自平衡二叉查找树 又被称为AVL树

平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度

   (1) 它的左右两个子树的高度差(平衡因子)的绝对值不超过1,

   (2) 并且左右两个子树都是一棵平衡二叉树,

   (3) 同时,平衡二叉树必定是二叉搜索树,反之则不一定

平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)

平衡二叉树的常用实现方法有AVL、红黑树、替罪羊树、Treap、伸展树等

preview​​

 红黑树:

详细理解可以参考如下:

红黑树与平衡二叉树_理解红黑树很难?不存在的,史上最详细的红黑树图解_weixin_39787397的博客-CSDN博客HashMap的实现原理可以说是面试中必问的一道面试题了,它可以考察一个程序员的数据结构功底和对技术的钻研深度。Java7中HashMap的实现就是一个数组,然后数组中的每一个元素又是一个链表,这个链表的存在是为了解决哈希冲突导致的问题,就是一个元素经过哈希计算后得到元素的存储位置,但是这个位置已经有其它元素占领,也就是占领元素和新插入元素都在这个数组中的同一个位置,此时就用链表进行维护...https://blog.csdn.net/weixin_39787397/article/details/111094291        红黑树理解,其实是自平衡二叉查找树的一种(近似,因为深度是:​​),为了实现自平衡,所添加的一些规则,理解应该带入自平衡概念,从平衡二叉查找树上去理解。红黑算法是用于自平衡。 

        (1)每个节点或者是黑色,或者是红色。

        (2)根节点是黑色。

        (3)每个叶子节点(NIL)是黑色。 [注意:该叶子节点是指为空(NIL或NULL)的叶子节点]

        (4)如果一个节点是红色的,则它的子节点必须是黑色的。

        (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

所以红黑树重点应该掌握插入,插入操作有两部分:

        (1)查找插入的位置。

        (2)插入后判断是否满足红黑树需求的条件,否,则需要做一些变换操作,也就是我们一开始接触红黑树这种数据结构时经常听到的树的左旋和右旋操作以及对节点进行变色等。

一些变换操作的概念:

  • 左旋:选中某个节点作为旋转节点,旋转节点的右子节点将会变成旋转节点的父节点,旋转节点的左子节点继续保持不变,但右子节点的左子节点则会变成旋转节点的右子节点。

  • 右旋:选中某个节点作为旋转节点,旋转节点的左子节点将会变成旋转节点的父节点,旋转节点的右子节点继续保持不变,但左子节点的右子节点则会变成旋转节点的左子节点。

  • 变色:节点由红节点变成黑节点或者由黑节点变成红节点。

注意:在一颗红黑树中插入只有不平衡才会进行变换,所以,不可能是本来节点X有一个子节点,添加到该节点下,让该节点有两个子节点,进行变换,因为是平衡的,方便理解左旋右旋的节点关系变化,下面图截取而来,我认为很方便理解:

AVL树遵守严格平衡的,所以优点是高度平衡,平衡因子因子不超过1,查询高效,路径最短,但是高度平衡意味着需要更多变换,所以插入删除相对不如。

红黑树因为去除了严格的平衡条件(深度:​​),所以在它的旋转保持平衡次数较少。插入删除次数多的情况下红黑树比严格的AVL树效果。

B 树(B-树 )、B+树 、B*树:

B树:(B树和B-树是同一东西,"-"是连接符)B-树是一种多路平衡搜索树,简单来说,就是每个节点不止存储一个数据值,每个节点也不止有两个子节点,比起平衡二叉树,它能很大程度减低树的高度,提高树的检索效率

B树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。

B树定义:

        B树的阶:B树中所有节点中孩子节点个数的最大值,通常我们用m表示(m >= 3),成为m阶B树。

m阶B树所满足一下的性质。

1)每个节点最多有m个分支(子树),除根节点和叶子节点之外的节点最少都应该含有ceil(m/2) 个分支(ceil表示向上取整),所以非根非叶子的分支的数量范围为 [ ceil(m/2),m]。根节点最少可以有两个分支。

2)某个节点中含有m个分支,那么它所包含的关键词就是(m-1)个,所以在m阶B树中,他的关键词的数量范围就是[ceil(m/2)-1,m-1] ,并且在节点中关键词的都是按照递增顺序排列的。

3)出叶子节点外所有的节点中的关键词都是互不相等的。如果说有一个这样的说法:B-树中一个关键字只能在树中某一个节点上出现,且节点内部关键字是有序排列的。这个说法是正确的。
4)B树中的叶子节点都是处在同一层中,一般都是用空指针表示,表示查找失败。

5)B树中某个节点中左子树所有的关键词都是小于这个节点的,右子树中所有的关键词都是大于这个节点的。这里就是和二叉排序树是相同的

        

说明:此图中的叶子节点在最后连线的下方,第三层不是叶子节点,最底层是空,代表查询失败

B树特性是这样的,基于平衡树的, 所以查找很简单,查找成功就是在除叶子节点之外的点中找到了值相等的关键词,失败就是指一直到叶子节点都没有找到相等的关键词。看树的特性意味着每个节点存的不止一个数据,且意味着可能会在改变树时通过算法进行变换节点数据和子节点数,一般是如果子节点数据超限则会取中间节点给父节点,为了维持B树特性小于中间值的数据自然分出为另一个子节点,注意跟据定义父节点数据树和子节点关系必然不会超限,如果父节点也超限且是更节点,那么就会增加树高度,这样可以最大降低树高度,减少查询,适用于外储存(例如硬盘)。

详情参考:B树详解 数据与结构_A_Bo的博客-CSDN博客_b树

B+树:
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别
        (1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
        (2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
        (3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
        (4)非叶子节点的子节点数=关键字数(来源百度百科)(根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1(来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现);
在这里插入图片描述​百度百科示意图
在这里插入图片描述​维基百科示意图 
        1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;

        2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;

        3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

        4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。

B*树:

         B*树是B+树的变种,相对于B+树他们的不同之处如下:

        (1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b树的初始化个数为(cei(2/3m))

        (2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;

 
        在B+树的基础上因其初始化的容量变大,针使得节点空间使用率更高,而又存有兄弟节点的指,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;
在这里插入图片描述 B树总结:别人的总结,俺认为很有道理

1、相同思想和策略
从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法和数据平衡策略来提升查找数据的速度;

2、不同的方式的磁盘空间利用
不同点是他们一个一个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的;

堆:

(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆的性质:
        1.堆中某个节点的值总是不大于或不小于其父节点的值。
        2.堆总是一棵完全二叉树。

将根节点最大的堆叫做最大堆或大顶堆,根节点最小的堆叫做最小堆或小顶堆。常见的堆有二叉堆、斐波那契堆等。

这里写图片描述这里写图片描述

堆是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指二叉树。 堆的特点是根节点的值最小(或最大),且根节点的两个树也是一个堆。 由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。

图的基本概念:多对多关系

图(graph)是一种网状数据结构,图是由非空顶点集合和一个描述顶点间关系的集合组成。

其形式化的定义如下:

Graph = ( V , E )

V = {x| x∈某个数据对象}

E = {<u , v>| P(u , v)∧(u,v∈V)}

V 是具有相同特性的数据元素的集合,V 中的数据元素通常称为顶点(Vertex) ),

E 是两个顶点之间关系的集合。P(u , v)表示 u 和 v 之间有特定的关联属性。

若<u , v>∈E,则<u , v>表示从顶点 u 到顶点 v 的一条弧,并称 u 为弧尾或起始点,称v 为弧头或终止点,

此时图中顶点之间的连线是有方向的,这样的图称为有向图(directedgraph)

若<u , v>∈E 则必有<v , u>∈E,即关系 E 是对称的,此时可以使用一个无序对(u , v)来代替两个有序对,

它表示顶点 u 和顶点 v 之间的一条边,此时图中顶点之间的连线是没有方向的,这种图称为 无向图(undirected graph)

在无向图和有向图中 V 中的元素都称为顶点,而顶点之间的关系却有不同的称谓,即弧或边,为避免麻烦,在不影响理解的前提下,我们统一的将它们称为 边(edge) 。

并且我们还约定顶点集与边集都是有限的,并记顶点与边的数量为|V|和|E|。

​​

无向图实际上也是有向图,是双向图

加权图:

在实际应用中,图不但需要表示元素之间是否存在某种关系,

而且图的边往往与具有一定实际意义的数有关,即每条边都有与它相关的实数,称为权。

这些权值可以表示从一个顶点到另一个顶点的距离或消耗等信息,在本章中假设边的权均为正数。

这种边上具有权值的图称为 带权图(weighted graph)

​​

图的存储结构

可以采用顺序存储结构和链式存储结构,更多采用链式存储结构

仅仅是学习之余总结,摘录了很多,也有一些微末之见,如有错误,敬请指教。

——2021.12.31

小陈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值