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