随笔分类 -  18-数据结构和算法

摘要:一. 树详解 1. 树优点及横向比较 (1). 数组 (2). 链表 (3). 哈希表 (4). 树 2. 相关术语 ◼ 1.节点的度(Degree):节点的子树个数。 ◼ 2.树的度 (Degree) :树的所有节点中最大的度数。 ◼ 3.叶子节点(Leaf):度为0的节点。(也称为叶节点) ◼ 阅读全文
posted @ 2023-12-14 10:01 Yaopengfei 阅读(61) 评论(1) 推荐(0) 编辑
摘要:一. 哈希表介绍 1. 什么是哈希表? 它的结构就是数组,但是它神奇的地方在于对数组下标值的一种变换,这种变换我们可以使用哈希函数,通过哈希函数可以获取到HashCode 哈希表的结构: [ [[key,value],[key,value],[key,value]], [[key,value],[k 阅读全文
posted @ 2023-12-06 08:47 Yaopengfei 阅读(316) 评论(1) 推荐(0) 编辑
摘要:一. 时间复杂度 1. 现实案例 举个例子(现实的例子):在一个庞大的图书馆中,我们需要找一本书。 在图书已经按照某种方式摆好的情况下(数据结构是固定的) ◼ 方式一:顺序查找 一本本找,直到找到想要的书;(累死) ◼ 方式二:先找分类,分类中找这本书 先找到分类,在分类中再顺序或者某种方式查找; 阅读全文
posted @ 2023-12-03 07:28 Yaopengfei 阅读(79) 评论(1) 推荐(0) 编辑
摘要:一. 链表详解 1. 对比数组 数组的创建通常需要申请一段连续的内存空间(一整块的内存),并且大小是固定的(大多数编程语言数组都是固定的),所以当当前数组不能满足容量需求时,需要扩容。 (一般情况下是申请一个更大的数组,比如2倍。 然后将原数组中的元素复制过去) 而且在数组开头或中间位置插入数据的成 阅读全文
posted @ 2023-11-16 08:30 Yaopengfei 阅读(29) 评论(1) 推荐(0) 编辑
摘要:一. 队列详解 1. 什么是队列? 它是一种受限的线性表,先进先出(FIFO First In First Out) 受限之处在于它只允许在队列的前端(front)进行删除操作;而在队列的后端(rear)进行插入操作 2. 队列常见的操作 enqueue(ele) :向队列尾部添加一个(或多个)新的 阅读全文
posted @ 2023-11-09 09:01 Yaopengfei 阅读(27) 评论(0) 推荐(0) 编辑
摘要:一. 邂逅数据结构和算法 1. 编程的最终目的 所有的编程最终的目的都是为了处理数据 2. 什么是数据结构 数据结构是存储和组织数据的方式,常用的数据结构有:数组、链表、栈、队列、树、图。 3. 什么是算法 算法是解决问题的办法、逻辑步骤。 二. 线性结构-数组 1. 什么是线性结构 (1) 是由n 阅读全文
posted @ 2023-11-06 13:57 Yaopengfei 阅读(42) 评论(1) 推荐(0) 编辑
摘要:一. 树表示法 1.双亲表示法 (1).含义 在一棵树中,任意一个结点的双亲只有一个,这是由树的定义决定的。双亲表示法就是利用了树的这个性质,在存储结点信息的同时,在每个节点中附设一个指向其双亲的指针, 指向双亲在链表中的位置。这种结构一般借助数组来实现。这样的链表也称为静态链表。 (2).实现思路 阅读全文
posted @ 2021-02-01 16:15 Yaopengfei 阅读(489) 评论(1) 推荐(0) 编辑
摘要:一. 树简介 1. 定义 (1) 树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 (2) 树(Tree)是n(n≥0)个节点(Node)的有限集合。在任意一颗非空树中,有且仅有一个特定的成为根(Root)的节点,当n>1时,其余节点分成m(m>0)个互不相交的有限集T1,T 阅读全文
posted @ 2021-01-31 21:14 Yaopengfei 阅读(703) 评论(1) 推荐(0) 编辑
摘要:一. 队列简介 1. 什么是队列 队列(Queue)只允许在一端进行插入,在另一端进行删除的线性表。(队尾入队,队头出队),可见队列具有先进先出(First In First Out)或后进后出( Last In Last Out)的特性。 C#中提供Queue队列类,它不是线程安全的; 如需要使用 阅读全文
posted @ 2021-01-27 21:15 Yaopengfei 阅读(567) 评论(3) 推荐(0) 编辑
摘要:一. 简介 1. 什么是栈? 栈是一种只能从表的一端存取数据且遵循 "先进后出"("后进先出") 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。 C#中提供顺序栈:Stack,它不是线程安全的;如果要使用线程安全的队列,需要用:ConcurrentStack。 分析: 阅读全文
posted @ 2021-01-26 08:09 Yaopengfei 阅读(429) 评论(1) 推荐(0) 编辑
摘要:1. 约瑟夫问题 加斯帕·蒙日是法国数学家,他在《数学的游戏问题》中讲了一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余人才能幸免于难,于是想了一个方法,30个人 围城一圈,从第一个人开始依次报数,每数到第九个的人就将他扔向大海,如此循环进行直到仅剩余15个人为止。问怎样 阅读全文
posted @ 2020-04-17 16:49 Yaopengfei 阅读(406) 评论(1) 推荐(0) 编辑
摘要:一. 基础 1. 前言 链式存储结构,又叫链表,逻辑上相邻,但是物理位置可以不相邻,因此对链表进行插入和删除时不需要移动数据元素,但是存取数据的效率却很低,分为三类: (1).单(向)链表:存储数据元素时,除了存储数据元素本身的信息外,还有一个指针,指向他的后继节点,最后一个元素的指针不指向任何元素 阅读全文
posted @ 2020-04-15 15:26 Yaopengfei 阅读(564) 评论(1) 推荐(0) 编辑
摘要:一. 前言 顺序表和链表由于存储结构上的差异,导致他们有不同的特点,从而适用于不同的场景。虽然他们都属于线性表,但他们的存储结构有着本质的不同: 1. 线性表存储数据,需要预先申请一块存储空间,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙, 如下图: 2. 链表的存储方式与顺序表截然相 阅读全文
posted @ 2020-03-25 17:44 Yaopengfei 阅读(989) 评论(0) 推荐(0) 编辑
摘要:一. 线性表 1. 前言 线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即 “ 把所有(一对一逻辑关系的)数据用一根线儿串起来,再存储到物理空间中 ”。这根线有两种串联形式,如下图,即顺序存储(集中存放)和链式存储(分散存放)。 图 3a) 是多数人想到的存储方式,而图 3b) 阅读全文
posted @ 2020-03-25 16:55 Yaopengfei 阅读(444) 评论(2) 推荐(0) 编辑
摘要:一. 前言 1. 思考 算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。 2. 算法 阅读全文
posted @ 2020-03-24 21:31 Yaopengfei 阅读(446) 评论(1) 推荐(0) 编辑
摘要:目录 阶段一 第一节:时间复杂度和空间复杂度 第二节:线性表→顺序表→链表 逐个击破 第三节:从多个角度分析顺序表、链表的区别和特点 第四节:顺序表剖析及利用数组手撸“动态数组ArryList” 第五节:链表剖析及自己手撸“单链表”实现基本操作(初始化、增、删、改等) 第六节:手撸“循环链表”及约瑟 阅读全文
posted @ 2020-03-23 14:32 Yaopengfei 阅读(966) 评论(1) 推荐(0) 编辑
摘要:一. 基础 1.前言 (1). 顺序表的标准解释:顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙,这个时候我们会发现数组和顺序表的性质很类似,实际上顺序表就是基于数组来实现。 (2). 顺序表的特点:访问数据块,如果第一个元素位置为L 阅读全文
posted @ 2020-03-04 08:36 Yaopengfei 阅读(349) 评论(1) 推荐(0) 编辑
摘要:1. 需求 把 x 元钱分给 y 个人,每个人获得钱数不等,有多的,也有少的。 PS: x元钱要精确到分,每个人获得到的钱也是精确到分。 2. 实现思路 (1). 先把 x 元钱 乘以 100,转换成 分,然后除以 y 人得到一个平均值,把这个平均值赋值给 每个人。 (2). 查看一下步骤①中平均值 阅读全文
posted @ 2019-12-05 09:37 Yaopengfei 阅读(597) 评论(1) 推荐(0) 编辑