数据结构

五分钟学编程:怎样才能学好笔试面试最爱考察的算法

删除回忆录丶 提交于 2020-02-26 01:23:13
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。 比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。 根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。 认识算法的N个阶段 我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。 第二次认识算法,还是在研究生期间找实习工作的时候

图(一)-数据结构学习笔记

a 夏天 提交于 2020-02-25 23:48:56
文章目录 1. 图简介 1.1 图的分类 1.2 图的描述 1.2.1 边的描述 1.2.2 路径(path)/环路(circle) 路径描述 路径分类 2. 如何使用代码描述图 2.1 邻接矩阵(adjacency matrix)和关联矩阵() 2.1.1 邻接矩阵 2.1.2 关联矩阵(incidence matrix) 1. 图简介 1.1 图的分类 图分为 有向图 (digraph): 即所有边皆有向的图 无向图 (undigraph): 即所有边皆无向的图 混合图(mixed graph): 即含有无向以及有向边的图 虽然图分为上面三种, 但是我们重点分析有向图, 因为所有的图都可以由有向图简化得到 1.2 图的描述 基于任意一个图都可以由点集V 与边集 E组成 , 我们可以对图 G 做出如下描述 G = ( V ; E ) G = (V;E) G = ( V ; E ) V(vertex): V 代表图的点集, 我们令 n = ∣ V ∣ n = |V| n = ∣ V ∣ ,n代表顶点的个数 E(edge): E 代表图的边集, 我们令 e = ∣ E ∣ e = |E| e = ∣ E ∣ , e代表边的个数 1.2.1 边的描述 我们使用 ( u , v ) (u,v) ( u , v ) 来描述一条边 若u,v的次序无所谓, 则称为 无向边(undirected

【数据结构】红黑树详解(插入与删除)

会有一股神秘感。 提交于 2020-02-25 21:58:38
目录 1.红黑树简介 2.红黑树的性质 3.红黑树操作 3.1 旋转操作 3.2 插入 3.2.1 情况一 3.2.2 情况二 3.2.3 情况三 3.2.4 情况四 3.2.5 情况五 3.2.6 插入总结 3.3 删除 3.3.1 情况一 3.3.2 情况二 3.3.2 情况三 3.3.4 情况四 3.3.5 情况五 3.3.6 情况六 3.3.7 删除总结 4.总结 1. 红黑树简介 红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为 对称二叉 B 树(symmetric binary B-trees) 。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的 红黑树 。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。 2. 红黑树的性质 学过二叉查找树的同学都知道,普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等

MySQL索引那些事

亡梦爱人 提交于 2020-02-25 21:35:56
原文链接 大家有没有遇到过慢查询的情况,执行一条SQL需要几秒,甚至十几、几十秒的时间,这时候DBA就会建议你去把查询的 SQL 优化一下,怎么优化?你能想到的就是加索引吧? 为什么加索引就查的快了?这就要从索引的本质以及他的底层原理说起。 索引是什么 那索引到底是什么呢?你是不是还停留在大学学『数据库原理』时老师讲的“索引就像字典的目录”这样的概念?老师讲的没错,但没有深入去讲。 其实索引就是一种用于快速查找数据的数据结构,是帮助MySQL高效获取数据的排好序的数据结构。 索引的好处 举例说明索引的好处以及是怎么加快查询的。 假设我们有一个表t,它有俩字段,Col1和Col2,如下: 不加索引 不加索引的情况下,SQL: select * from t where t.col2=89 ,需要从表的第一行一行行遍历比对col2的值是否等于89,这样需要比对6次才能查到。这只是只有几行记录的表,那如果是百万级千万级的表呢?是不是就比较的次数就更多了,那还不得慢死。 加索引 如果col2这列加了索引,mysql内部会维护一个数据结构。假设mysql用的数据结构是红黑树(右子树的元素大于根节点,左子树的元素小于根节点)的数据结构建立索引,那就像上图右边那样。这样的话,刚才的那条SQL是不是只需要2次磁盘IO就查到了,是不是快很多了。 这就是索引的好处。索引使用比较巧妙的数据结构

Java集合

北城余情 提交于 2020-02-25 21:05:48
概述: List , Set, Map都是接口,前两个继承至 Collection 接口, Map 为独立接口 List下有 ArrayList , LinkedList ,Vector Set下有 HashSet , TreeSet ,LinkedHashSet Map下有 Hashtable ,LinkedHashMap, HashMap , TreeMap     常用集合类: ArrayList , LinkedList, HashSet, HashMap Connection接口: —---- List 有序,可重复 ArrayList 优点: 底层数据结构是数组, 查询快,增删慢。 缺点: 线程不安全,效率高 LinkedList 优点: 底层数据结构是链表, 查询慢,增删快。 缺点: 线程不安全,效率高 Vector(已放弃) 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低 (数据量较大,同时数据查询到条件多的时候选择使用ArrayList       ,增删条件多的时候选择使用LinkehLish   一般情况直接使用ArrayList。) —----Set 无序,唯一 HashSet 底层数据结构是哈希表。 (无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals() LinkedHashSet

从例题看数据结构队列和栈

喜欢而已 提交于 2020-02-25 20:01:51
今天是周一,周末周六大了两天绿盟杯,被各种大佬暴虐,于是身为菜鸡的我就决定闭关,好了话不多说,今天记录下我看数据结构时的思考和转载的啊哈算法书一些知识。 首先,开篇是这样描述的:星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓 鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的 第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌 的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即 可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人 手中的牌全部出完时,游戏结束,对手获胜。 假如游戏开始时,小哼手中有 6张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6张牌,顺序 为 3 1 3 5 6 4,终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来 自动判断谁将获胜。这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。 在这道题目中,我们首先考虑的事扑克牌的存放的问题,这可以用数组完成,接下来我们考虑桌面牌的存放,也是可以用数组表示,但是数组长度怎么设置呢,开小了,会导致越界问题;开大了,又会导致浪费;由于牌又有9张不同的,我们考虑设置成10,好吧这些貌似有点low,我们直接进一步分析,首先设置队列如下: struct

什么是Redis

无人久伴 提交于 2020-02-25 18:43:56
1.1 什么是Redis 1.redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value 存储系统。 2.它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集 合)、zset(sorted set –有序集合)和hash(哈希类型,类似于java中的map)。 3.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。 1.2 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 1.3 Redis与其他key-value存储有什么不同? Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

数据结构之数组-c代码实现

不问归期 提交于 2020-02-25 18:32:42
在上一篇文章里讲了数组的具体内容,然后自己使用c语言对数组进行了实现。 其中定义了一个结构体,定义了长度、已使用长度和地址指针。 定义alloc函数来分配内存空间 之后便是插入元素的insert函数、打印数组的dump函数、搜索数组的search函数和删除数组的del函数 所有的操作步骤都是在main函数中提前定义好了,来进行验证前面所实现的函数 如果需要下载代码,请移步文章最后。 运行结果如下 代码: GitHub 文章首发公众号和个人博客: 公众号:无心的梦呓(wuxinmengyi) 这是一个记录红队学习、信安笔记,个人成长的公众号 扫码关注即可 博客: http://blog.seclibs.com/ 记录红队相关学习笔记 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3161570

数据结构之数组

僤鯓⒐⒋嵵緔 提交于 2020-02-25 17:13:19
文章来源: http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e6%95%b0%e7%bb%84/ 在说数组之前咱们先明确两个概念,什么是 线性表 ,什么是 非线性表 顾名思义,线性表就是把数据排成一条,每个数据只有前后两种情况,常见的线性表有 数组、链表、队列、栈 等 那非线性表就更好理解了,数据不是按照一条线来排列的,每个数据并不只有前后两个方向,常见的有 二叉树、堆、图 等 明白了这个概念之后,咱们再来说数组,什么是数组? 数组不仅是大多数编程语言中的一个数据类型,它更是一个最基础的数据结构。 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 关于线性表前面已经说过了,接下来说具有连续的内存空间、存储相同类型的数据,也正是因为这一点才使数组有了 随机访问 的特性。 我们拿下面这个例子来进行说明,有一个长度为10的int类型的数组,我们给它分配一块连续内存空间 1000~1039,内存块的首地址为1000 当我们需要访问其中的数据的时候,计算机会先通过一个寻址公式来找到内存地址,然后再读取其中的数据。 在数组中我们使用的寻址公式为 a[i]_address = base_address + i * data_type_size base

数据结构:队列的顺序存储结构(循环队列)

丶灬走出姿态 提交于 2020-02-25 15:43:13
队列的定义: 队列是只允许在一端进行插入操作,而在另一端进行删除操作的 线性表 。 队列的抽象数据类型: ADT 队列(Queue) Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation InitQueue(*Q): 初始化操作,建立一个空队列。 DestroyQueue(*Q): 若队列Q存在,则销毁它。 ClearQueue(*Q): 将队列清空。 QueueEmpty(Q): 判断队列是否为空。 GetHead(Q,*e): 若队列存在且非空,用e返回Q的队头元素。 EnQueue(*Q,e): 若队列Q存在,插入新元素e到队列Q中并成为队尾元素。 DeQueue(*Q,*e): 删除队列中的队头元素,并用e返回。 QueueLength(Q): 返回队列Q的元素的个数。 endADT 线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式,有顺序栈和链栈。同样队列作为一种特殊的线性表,也存在这两种存储方式。先来看队列的顺序存储结构。 队列的顺序存储结构同线性表的顺序存储结构存在着同样的问题,队头出队列要后面的元素依次向前移动,时间复杂度为O(n)。 因为队列的每次删除元素都是从队头,所以每次删除都有大量的元素要移动,这样算法的效率很不好。于是改进一下,队头不一定要在数组的下标为0的位置。也就是说删除一个元素