数据结构

数据结构与算法系列十三(选择排序)

浪子不回头ぞ 提交于 2020-04-06 08:22:31
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 上一篇: 数据结构与算法系列十二(插入排序) 中

数据结构和算法(面试)

馋奶兔 提交于 2020-04-06 04:28:30
排序算法 直接插入排序 :将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过 希尔排序 :将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序 简单选择排序 :比较+交换 堆排序 :构建大顶堆进行排序 如何手写一个堆 1. 插入一个数 heap[ ++ size ] = x; up(size); 2. 邱集合当中的最小值 heap[1] 3. 删除最小值 heap[1] = heap[size]; size --; down(1); 4. 删除任意一个元素 heap[k] = heap[size]; size --; down(k); up(k); 5. 修改任意一个元素 heap[k] = x; down(k); up(k); 堆排序 int n, m; int h[ 1000 ], cnt; void down( int u ) { int t = u; if( u * 2 <= cnt && h[ u * 2 ] < h[ t ] ) t = u * 2; if( u * 2 + 1 <= cnt && h[ u * 2 + 1 ] < h[ t ] ) t = u * 2 + 1; if( u != t ) {

我说我不会排序算法,阿里就挂了我

女生的网名这么多〃 提交于 2020-04-05 22:40:05
前言 工作已经有一段时间了,有的时候会跟同事们打趣:“ 如果你让我现在去手写一个快速排序,我怕是真的写不出来 ”。 如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。 经历过校招的人都知道, 算法和数据结构 都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以 排序 和各种的 基本数据结构 开始入门。我花了一个星期将 八大基础排序 和 链表/二叉树/栈/队列 制作成一份 精美的PDF 。 这份PDF阅读体验肯定是要比公众号和各大的博客平台的文章要好的。PDF内容 纯手打 ,有不懂的可以来问我。 下面来简单介绍一下八大基础排序和基础的数据结构,每种排序的思想和基础的 讲解和源码 在PDF里边有。 冒泡排序 思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要 n-1 趟排序(比如10个数,需要9趟排序) 代码实现要点: 两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数 。 每趟过后,比较的次数都应该要减1 选择排序

学习数据结构的第九天(二)(包括有一些还未解决的树的基本知识的问题)

白昼怎懂夜的黑 提交于 2020-04-05 18:43:01
先插入一些关于树的有关知识,完美二叉树,完全二叉树等,为之后学习AVL树,红黑树做点准备。 未解决: 问题1:如何用avl实现其他的数据结构 问题2:如果是avl树旋转了的话,那么搜索等结构还怎么做呢?就不再是小于走left,大于走right了吗? 问题3:红黑树的具体实现和目的 问题4:关于各种排序的时间复杂度以及排序。 先引入关于树的知识: 添加一个:度为0的节点和度为2的节点的关系是什么? 能够回答这17个问题是关键。 (1) 2的i次方个 (相当于等比数列) (2) Key:这里也就是等比数列求和,求和的意思是:前n项和,因为从0开始的时候,已经是1项了,所以是n+1项 (3)度:结点的子树个数(就是说:某个节点的度 不然就是0 不然就是1 不然就是2) 度分为节点的度和树的度,树的度:意思是所有节点的最大的度 key:也就是注意概念:节点的度和树的度的区别,节点的XX和树的XX,树一般作为统计概念,统计其中最大的 (4)入度和出度是什么概念,入度和出度是图的概念,树是度的概念。 这里讲的是节点V0的入度是2,出度是1. 入V0和出V0,记住,节点的度就是它的子树的个数就对了。 (5)二叉树,每个节点的子树最多有两颗,就是二叉树。 key:因为树的度是2,所以意思是最大的话是2. (6)完全二叉树 完美二叉树 意思是:完全二叉树可以最后一层 不完全

redis问学(一)

ε祈祈猫儿з 提交于 2020-04-05 16:38:04
一、主从复制 1. redis主从机制了解么?怎么实现的? 答: 二、数据结构 1. Redis熟悉么,了解哪些数据结构? 答: 2. 红黑树了解么,时间复杂度?既然两个数据结构时间复杂度都是O(logN),zset为什么不用红黑树? 答: 来源: https://www.cnblogs.com/chendf/p/12636621.html

前端-数据结构和算法(一)

别等时光非礼了梦想. 提交于 2020-04-05 16:37:53
1.基础实用基础的数据结构详情 数据结构(data structure [ˈstrʌktʃə(r)] )是计算机存储、组织数据的方式; 算法(algorithm [ˈælɡərɪðəm] )是解决问题的方法/步骤和策略; 数据结构Array js中的数组结构非常简单(浏览器帮助我们进行封装处理好的) 可以存储不同的数据类型值 数组容量伴随存储内容自动缩放 Array.prototype上提供数组的操作方法 优势 :基于索引直接进行查找和获取,效率很高; 弊端 :进行中间插入和删除时,性能非常低( 数组坍塌 和 删除中间项的优化) 栈结构Stack 先进后出; 只能在一段操作:包括添加(进栈)和删除(出栈); 递归算法中的无限递归会出现栈溢出。 栈方法: class Stack { container = []; // 进栈 enter(element) { this.container.unshift(element); } // 出栈 leave() { return this.container.shift(); } // 栈的长度 size() { return this.container.length; } // 获取栈中的结果 value() { return this.container.slice(0); } } let sk = new Stack; 面试一:

java List

∥☆過路亽.° 提交于 2020-04-05 16:36:13
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步。默认长度10,超过再new一个数组延长50%,元素重新拷贝。 LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询速度稍慢。 Vector:底层是数组数据结构。线程同步。被ArrayList代替。默认长度10,超过100%延长。 来源: https://www.cnblogs.com/hongxiao2020/p/12637542.html

数据结构1 - 06-图1 列出连通集

倖福魔咒の 提交于 2020-04-04 18:05:16
1 #include<stdio.h> 2 #define MAXN 10 3 int g[MAXN][MAXN],vis[MAXN],n,e; 4 void init(); 5 void read(); 6 void BFS(int x); 7 void DFS(int x); 8 int main(){ 9 int i,j; 10 scanf("%d %d",&n,&e); 11 init(); 12 read(); 13 14 for(i=0;i<n;i++){ 15 if(vis[i]==0){ 16 printf("{"); 17 DFS(i); 18 printf(" }\n"); 19 } 20 } 21 for(i=0;i<n;i++) vis[i]=0; 22 for(i=0;i<n;i++){ 23 if(vis[i]==0){ 24 printf("{"); 25 BFS(i); 26 printf(" }\n"); 27 } 28 } 29 30 return 0; 31 } 32 void init(){ 33 int i,j; 34 for(i=0;i<n;i++) vis[i]=0; 35 for(i=0;i<n;i++) 36 for(j=0;j<n;j++){ 37 g[i][j]=0; 38 } 39 } 40 void read(){ 41

数据结构 - Queue、Deque 接口

寵の児 提交于 2020-04-04 11:52:12
简介 队列是一种特殊的线性表。队列有单向队列和双向队列,队列内部结构多大使用数组和链表存储,一般使用数组存储的都会有初试长度和最大长度等,一般使用链表存储没有长度限制。平时在使用中最好不要像队列中插入null(通常也不允许,LinkedList除外),因为null值通常用于poll方法表示当前队列没有元素了,插入null值poll就有歧义。 Queue 接口 public interface Queue<E> extends Collection<E> Queue继承Collection,它是单向队列,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。 Queue 方法 // 添加元素到尾部,队列满时抛IllegalStateException异常 boolean add(E e); // 添加元素到尾部,队列满时返回false boolean offer(E e); // 移除头部元素,队列空时抛NoSuchElementException异常 E remove(); // 移除并返回头部元素,队列为空时返回null E poll(); // 查询头部元素,队列为空时抛NoSuchElementException异常 E element(); // 查询头部元素,队列为空时返回null E peek(); Deque 接口 public interface Deque<E

一文讲透数据结构中的树,建议收藏!

跟風遠走 提交于 2020-04-04 10:32:16
数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。 为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。 不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。 01. 「树」现实与虚拟的抽象 在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。 在脑海里尝试画一下「家谱树」。 看完现实中的树,那来看一看计算机的文件系统组织形式。 无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。 那到底什么是树呢? 树是由 n(n≥0)个结点组成的有限集合。 当 n = 0 时,称为空树; 当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。 如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。 知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。 图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。 横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。 知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。 02.「树」有术语 节点 or