算法与数据结构

20182307 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

烈酒焚心 提交于 2019-12-27 13:49:59
目录 20182307 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 学习进度条 点评过的同学博客和代码 20182307 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 第12章 算法分析 从算法效率角度分析了软件开发的目标,介绍了算法分析的概念,引进了增长函数与时间复杂度的概念。通过比较不同的算法的增长函数与时间复杂度来分析算法的效率。 第14章 栈 引进了栈这个“先进后出”的线性集合的概念,介绍了栈相关的push,pop,peek等操作。与继承、多态的知识相关联引出了泛型的概念,并以计算后缀表达式为例演示了栈的应用。 第15章 队列 引进了队列这个“先进先出”的线性集合的概念,介绍了队列的enqueue,dequeue等操作。介绍了循环数组解决队空队满情况的方法。 学习笔记: 计算机系统中最重要的资源之一是 CPU时间 。完成具体任务的算法效率是决定 程序执行速度 的一个主要因素。 增长函数 显示了与问题大小相关的时间或空间利用率。 算法的阶 由算法增长函数的主项决定。 处理器速度和内存不能弥补算法增长函数的上界。 集合是收集并组织其他对象的对象。主要分为两类:线性和非线性的。 栈是一个线性集合,处理方式是

数据结构和算法之栈1

二次信任 提交于 2019-12-27 04:33:24
数组模拟栈 (1)将数组模拟成栈的思想: //用数组模拟栈的思想: * 1·先创建栈,用数组 * 2·定义一个变量top表示栈顶,初始化为-1 * 3·入栈:top++,stack[top]=val,要进行栈满的操作 * 4·出栈:数据取出:int value=stack[top];top--即可,要进行判断栈为空的操作,因为有返回值,所以一般我们进行异常抛出*/ 1.1:注意:因为是拿数组进行模拟栈 1:在栈类中有一个数组 2:在栈类中有一个maxSize定义栈的大小;因为栈是有大小的 3:在栈类中必须有一个指针一直指向栈顶,初始值为-1; 4:其次是在栈类中写入方法,模拟实现栈即可 1.2:栈的代码如下所示 package com.dataStrcture; import java.util.Scanner; //用数组模拟栈 /*思想: * 1·先创建栈,用数组 * 2·定义一个变量top表示栈顶,初始化为-1 * 3·入栈:top++,stack[top]=val,要进行栈满的操作 * 4·出栈:数据取出:int value=stack[top];top--即可,要进行判断栈为空的操作,因为有返回值,所以一般我们进行异常抛出*/ class ArrayStack{ public int maxSize;//栈的大小 public int[]stack; public int

数据结构与算法(2)--数组

允我心安 提交于 2019-12-27 03:16:53
引导 这一章节开始,正式进入数据结构与算法的学习过程中。由简到难,先开始学习最基础的数据结构–数组。 我相信对于数组,大家肯定是不陌生,因为数组在大多数的语言中都有,也是大家在编程中常常会接触到的。我不会说数组有多困难,但是它绝对不是像我们所想的那么简单而已。 带着问题进入今天的课题: 为什么数组的下表从0开始,而不是从1开始? 什么是数组 我们还是从专业的角度来介绍一下数组: 数组是一种 线性表 数据结构。它用一组 连续的内存空间 ,来储存一组 相同类型的数据 。其中有几个知识点是需要我们了解的。 第一点是闲心结构的概念。线性结构具有以下几个特点: 有唯一的首元素 有唯一的尾元素 除了首元素,所有的元素都有唯一的前驱 除了尾元素,所有的元素都有唯一的后继 数据元素之间存在“一对一”的关系 只要不满足以上特点的,就是非线性表。 常见的线性结构有:栈,数组,队列,堆,链表 常见的非线性结构有:树,图 第二点是连续的内存空间和相同类型的数据结构。这两点正是数据数组强大的主要原因–高效的访问操作(随机访问)。我们知道数组在查询操作中具有很高的效率。但是原因是什么呢?我们一起来分析一下。 例: 我们定义一个int 类型的数组,长度为10。假设首地址是base_address是1000。,那么它在内存中的分布应该如下图: 比如我现在要访问数组中第5个数据a[4] (数组下标从0开始)

最全的Redis解析,赶紧收藏

扶醉桌前 提交于 2019-12-26 22:49:27
在这篇文章中,我们将彻底了解 Redis 的使用场景、Redis 的五种数据结构,以及如何在 Spring Boot 中使用 Redis,文章的最后还会列举面试过程中经常被问到的关于 Redis 的问题以及其解决方案。 Redis 简介 Redis 是一个开源(BSD 许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复制、Lua 脚本、LRU 收回、事务以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。在实际的开发过程中,多多少少都会涉及到缓存,而 Redis 通常来说是我们分布式缓存的最佳选择。Redis 也是我们熟知的 NoSQL(非关系性数据库)之一,虽然其不能完全的替代关系性数据库,但它可作为其良好的补充。 Redis 使用场景 微服务以及分布式被广泛使用后,Redis 的使用场景就越来越多了,这里我罗列了主要的几种场景。 分布式缓存 :在分布式的系统架构中,将缓存存储在内存中显然不当,因为缓存需要与其他机器共享,这时 Redis 便挺身而出了,缓存也是 Redis 使用最多的场景。 分布式锁 :在高并发的情况下,我们需要一个锁来防止并发带来的脏数据,Java 自带的锁机制显然对进程间的并发并不好使,此时可以利用

数据结构与算法 — 链表

偶尔善良 提交于 2019-12-26 21:58:27
链表 (通过“指针”将一组零散的内存块串联起来使用。) 三种常见链表结构: 单链表:链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫做后继指针next 如图所示,你会发现,其中有两个结点比较特殊,他们分别是第一个结点和最后一个结点。我们习惯把第一个结点叫做头结点,把最后一个结点叫做尾结点。其中,头结点用来记录链表的基地址。有了它,我们可以遍历得到整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址NULL,表示这是链表上最后一个结点。与数组一样,链表也支持数据的查找、插入和删除操作。我们知道,进行数组的插入,删除操作时,为了保持内存的连续性,需要做出大量的数据搬移,所以时间复杂度是O(n)。而在链表中插入或者删除一个数据,我们并不需要为了保持内存的连续性而搬移结点,图中可以看出,针对链表的插入和删除操作,我们只需要考虑相邻结点的指针改变,所以对应时间复杂度是O(1)。 但是有利也有弊。链表想要随机访问第K个元素,就没有数组高效了。因为链表中的数据并非连续存储的,所以无法像数组那样,根据首地址和下标,通过寻址公式就能计算出内存地址,而是需要根据指针一个结点一个结点地依次遍历,直到找到对应的结点。所以

数据结构和算法 – 8.链表

。_饼干妹妹 提交于 2019-12-26 21:58:06
8.1.数组存在的问题 在处理列表的时候数组是常用的数据结构。数组可以对所存储的数据项提供快速地存取访问,而且它很易于进行循环遍历操作。当然,数组已经是语言的一部分了,用户不需要使用额外的内存,也不需要花费因使用用户自定义的数据结构所需的处理时间。 然而正如所见,数组不是一种最佳的数据结构。在无序数组中查找一个数据项是很慢的,这是因为在找到要查找的元素之前需要尽可能地访问到数组内的每一个元素。有序(排序)数组对查找而言会更加高效一些,但是插入和删除操作还是很慢的,因为需要向前或向后移动元素来为插入留出空间,或者为删除移除空间。更别提在有序数组内还需要为插入元素查找到合适的位置了。 8.2.定义 链表是被称为节点的类对象的群集。每一个节点通过一个引用链接到列表内的后继节点上。节点包括存储数据的字段和节点引用的字段。到另外一个节点的引用被称为是链接。 数组:元素是通过位置(索引)进行引用 链表:元素是通过它们与数组其他元素的关系进行引用 大家会说“ Bread”跟在“ Milk”的后面,而不会说“ Bread”是在第二个位置上。遍历链表是从链表的起始节点一直到末尾节点。 还需要注意的一点就是对链表结尾的标记是通过指向空( null)值实现的。既然是在内存中处理类对象,所以就用空( null)对象来表示列表的末尾。 在许多链表的实现中通常会包含一个被称为“头节点

数据结构和算法双链表

半世苍凉 提交于 2019-12-26 21:57:51
双向链接列表是链接列表的变体,与单链接列表相比,可以以两种方式轻松地向前和向后导航。以下是理解双向链表概念的重要术语。 链接 - 链接列表的每个链接都可以存储称为元素的数据。 Next - 链接列表的每个链接都包含指向下一个名为Next的链接的链接。 上一页 - 链表的每个链接都包含一个名为Prev的上一个链接的链接。 LinkedList - 链接列表包含指向名为First的第一个链接和名为Last的最后一个链接的连接链接。 双重链表清单表示 根据以上说明,以下是要考虑的重点。 双链表包含一个名为first和last的链接元素。 每个链路都带有一个数据字段和两个名为next和prev的链接字段。 每个链接使用其下一个链接与其下一个链接链接。 每个链接使用其先前的链接与其先前的链接链接。 最后一个链接带有一个null链接以标记列表的结尾。 基本操作 以下是列表支持的基本操作。 插入 - 在列表的开头添加元素。 删除 - 删除列表开头的元素。 Insert Last - 在列表末尾添加元素。 最后 删除 - 从列表末尾删除元素。 Insert After - 在列表项 之后 添加元素。 删除 - 使用键从列表中删除元素。 显示转发 - 以转发方式显示完整列表。 向后 显示 - 以向后方式显示完整列表。 插入操作 下面的代码演示了双向链表开头的插入操作。 例 //insert link

数据结构树之红黑树

纵饮孤独 提交于 2019-12-26 08:13:59
红黑树简介:   红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED 或 BLACK。通过对任何一条根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径回避其他路径长处2倍,因而是近似平衡的。   树的每个结点包含 5 个属性:color,key,left,right和p。如果一个结点没有子结点或者父结点,则该结点相应的指针属性的值为NULL。我们可以把这些NULL视为指向二叉搜索树叶结点的指针,而把带关键字的结点视为树的内部结点。 红黑树的性质:   一棵红黑树是满足下面红黑性质的二叉搜索树:   1.每个结点或是红色的,或是黑色的   2.根节点是黑色的   3.每个叶结点(NULL)是黑色的   4.如果一个结点是红色的,那么他的两个子结点都是黑色的   5.对于每个结点,从该结点到其所有后代叶结点的简单路径上,包含相同数目的黑色结点   这 5 个性质中1,2,4都比较好理解。3与我们常说的(大部分数据结构书上说的)叶结点有一点点区别,如下图:    那性质5又是什么意思呢?我们再来看一个图:      由红黑树的 5 个性质可知,上幅图中左图是红黑树,而右图非红黑树。右图中满足红黑树的性质1.2.3.4,但是不满足性质5:从根节点6(不包括根节点)到各叶结点的简单路径上的黑色黑色结点个数并不相等。例如:6-1有2个,而6

什么是数据结构?

故事扮演 提交于 2019-12-26 06:52:23
大学是计算机本专业的同学肯定有学习过数据结构这门课程,我也上过这门课,大学老师差不多花了半个学期的时间去讲这门课程,但是现在让我回想他上课讲了什么,我已经记不清了,因为大学课程有个共同的特点,又慢又长。 通过本文主要解释一下我理解的数据结构是什么样子,开始进入正题。 首先,我们为什么学习数据结构? 举个例子: 如果说学习语文的最终目的是写小说的话,那么如果一个小学生刚刚学习了识字,就让他去写小说,显然这是不现实的  中间他必须经历写作文。写作文的目的有两个 掌握写作套路、技巧(理论水平),保证以后写小说的质量 提高写作水平(动手能力),为以后写小说打好基础 学习一门计算机语言就好比识字阶段,以后开发项目就好比写小说,中间都离不开数据结构的学习,就好比学习写小说之前要先学会如何写作。 高级计算机程序设计的理论指导 拧螺丝需要用到扳手,用钳子也可以,只不过没有那么好用。学习数据结构,就是为了了解以后在IT行业里搬砖需要用到什么工具,这些工具有什么利弊,应用于什么场景。你会发现这些基础工具也存在着一些缺陷,你不满足于此,此时,你就开始自己在这些数据结构的基础上加以改造,这就叫做自定义数据结构。 掌握了开车的本领,桑塔纳、宝马、奔驰都可以上手开了 数据结构可以采用不同的语言来描述和实现,我这里所讲述的自然是Java语言。 提升编程能力 个人认为数据结构是编程最重要的基本功没有之一

数据结构和算法之二叉树

可紊 提交于 2019-12-25 07:09:26
一、为什么需要树这种数据结构 是因为之前的数组和链表两种存储结构对增删改查都各有利弊,而且差异明显。所以树这种结构就是增删改查效率差异不是很明显,增删改查所耗费时间都比较均衡的一种数据结构。 1、数组存储方式 1.1、优点 通过下标方式访问元素,速度快 。对于有序数组,还可以使用 二分查找 来提高检索速度。 1.2、缺点 若检索具体某个值,或 插入值(按一定顺序),会整体移动 。效率较低。 2、链表存储方式 2.1、优点 在一定程度上对数组存储方式进行了优化(比如插入一个节点,只需要将插入节点连接到链表中即可,删除效率也很好) 2.2、缺点 在进行检索时,效率仍然很低,比如检索某个值,需要从头节点开始遍历进行判断。 3、树存储方式 3.1、说明 可以利用 二叉排序树(Binary Sort Tree) ,既可以保证数据的检索速度,同时也可以保证数据的插入、删除、修改的速度。 二叉排序树就是要求任何 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2、案例 3.2.1、假设有一颗二叉排序树【8 4 11 2 6 10 13】,如下图所示 二叉排序树, 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2.2、如下需求 3.2.2.1、查找10 具体步骤: 总共需要两次查找 1、判断10与根节点大小,大于根节点,在右侧查找 2