算法与数据结构

数据结构与算法之美---01 为什么要学习?

江枫思渺然 提交于 2019-12-01 15:59:32
原因: 大厂(BAT,Google,Facebook)面试,都喜欢考算法、让人现场写代码(看中长期潜力,能解决实际工作问题) CRUD业务开发工程师(数据结构与算法能评估性能) 基础架构研发工程师,达到写出开源水平的框架(各方面细节) 对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码 个人总结上面原因: 工作需要,特别是大公司对计算机内功要求高 个人技术成长需要,提高代码水平,写出质量高的代码 作者提供的有关技术的名词: Spring,RPC 框架 消息中间件 Redis (Key-Value 数据库 ) 跳表,链表,二叉树 大 O 复杂度分析,快排 人工智能,区块链 疑问:(提问老师) 什么是业务开发工程师、基础架构研发工程师? 性能和资源的消耗指什么? 业务开发中的各种框架、中间件和底层系统,这些名词在开发中怎么理解? 99% 响应时间什么意思? 性能到底指什么?性能跟数据结构算法有关系? 初级工程师,资深架构师,怎么评定自己在大厂的级别定位?什么水平能达到,怎么自我评估? 每个项目都是重复地堆砌业务逻辑而已,完全没有难度递进,看不出有能力提升?自己如何摆脱这种困境? 面对的是千万级甚至亿级的用户,开发的是 TB、PB 级别数据的处理系统 ,平时如何模拟这种情形? 性能几乎是开发过程中时刻都要考虑的问题。怎么时刻考虑性能问题? 反思: 何为编程能力强?    皮一下

数据结构与算法-循环队列

淺唱寂寞╮ 提交于 2019-12-01 15:57:12
在顺序队列出队列的时候,数组前面会有空余的空间,我们可以将数据往前搬移,提高空余空间的使用,但是效率比较低;我们可以使用循环队列来提高效率。 Head代表队列头,Tail代表队列尾,n代表队列的长度,如果Head与Tail大于等于n的时候就是到了循环点,可以将Head或者Tail余n来代表当前n内的位置。 一开始空余的循环队列,Head和Tail的位置 当有四个元素(a,b,c,d)入队,Head和Tail的位置 当所有元素出队后,Head与Tail是相等的,就是空队列 当满队列,Head和Tail的位置,可以看到Tail的位置是空余的,如果再加入一个元素的话就导致head与tail相等,判断条件是(Tail + 1) % n==Head 代码实现 template<class T> class MyCircularQueue { public: MyCircularQueue(int nQueueSize); ~MyCircularQueue(); bool empty() const; int size() const; void pop(); T front() const; T back() const; bool push(T const&); protected: T* m_pArrayQueue; int m_nQueueSize; int m_nHead; int

数据结构与算法之美---开篇

喜你入骨 提交于 2019-12-01 15:26:54
终于组队学习成功,开始第一次的团队学习,学习计划内容,希望通过博客输出,监督自己做的更好。 时间安排(2019.10.15-2019.12.28),内容安排如下 : 1、《数据结构与算法之美》-王争(极客时间的课程),每讲最多20分钟,73讲。(计划:每天20分钟左右,隔天交流。60天完成) 2、LeetCode 探索-数据结构专栏,9个。(计划:7天完成) 3、LeetCode 探索-面试,主要是讲算法,8个。(计划:7天完成) 4、牛客网刷题,数据结构9类2953个,算法5类1189个。(计划:自行检测) 5、LintCode 数据结构2块19个,算法2块20个,其他栏目的测试题等。(计划:自行检测) 6、学习的过程中,把学到的内容进行博客输出。 根据作者的整理如下: 作者提到的: 书籍:《算法导论》 框架:高可用,微服务,服务治理 计算机基础知识: (有待补充) 操作系统,计算机网络,编译原理,数据结构与算法 专栏内容设计:(学习目标) 精选最实用的内容 怎么用,为什么用这种数据结构和算法,了解背后的设计思想 结合案例,如何实际应用 专栏模块:(学习内容) 入门篇:时间、空间复杂度分析,大O表示法的由来,最好、最坏、平均、均摊复杂度分析方法 基础篇:最基础、最常用的数据结构和算法 高级篇:不那么常用的数据结构和算法,需要知道,目的:开拓视野,训练逻辑思维 实战篇:剖析开源项目

数据结构与算法之二叉树

馋奶兔 提交于 2019-12-01 09:32:12
树 树的概念 树(英语:tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>=0)个有限节点组成一个具有层次关系的集合。把它叫做“ 树 ”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 当n=0时,为空树,在任何一棵空树中: 有且仅有一个特定的称为根(Root)的节点 当n>1时: 除根节点外,其余节点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树的术语 节点的度 :一个节点含有的子节点的个数称为该节点的度。 B的子节点为D、E、F, 因此,节点B的度为3。 树的度 :一棵树中,最大的节点的度称为树的度。 最大的节点的度为B节点的度,因此该树的度为3。 叶节点 或 终端节点 :度为零的节点。 不能往下再分的节点:K、J、F、L、O、P。 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点。 如:K的父节点为I。 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点。 B的孩子节点或子节点为:D、E、F。 兄弟节点

HashMap底层数据结构详解

梦想与她 提交于 2019-12-01 07:17:04
一、HashMap底层数据结构 JDK1.7及之前:数组+链表 JDK1.8:数组+链表+红黑树 关于HashMap基本的大家都知道,但是为什么数组的长度必须是2的指数次幂,为什么HashMap的加载因子要设置为0.75,为什么链表长度大于等于8时转成了红黑树? HashMap添加元素分析 当添加元素时,会通过哈希值和数组长度计算计算下标来准确定位该元素应该put的位置,通常我们为了使元素时分布均匀会使用取模运算,用一个值去模上总长度,例如: index=hashCode % arr.length (实际并非这样,后面讲解),计算出index后,就会将该元素添加进去,理想状态下是将每个值都均匀的添加到数组中,但问题是不可能达到这样的理想状态,这时候就会产生哈希冲突,例如:小龙女通过计算添加到了数组3号位置,但是此时杨过这个元素通过计算产生了一个与小龙女相同的索引位置,这是就产生了哈希冲突 此时,就产生了第二种数据结构——链表,冲突的元素会在该索引处以链表的形式保存 但是当链表的长度过长时,其固有弊端就显现出来了,即查询效率较低,时间复杂度可能会达到O(n)级别,而数组的查询时间复杂度仅为O(1) 此时,就引出了第三种数据结构——红黑树,红黑树是一棵接近于平衡的二叉树,其查询时间复杂度为O(logn),远远比链表的查询效率高。但如果链表长度不到一定的阈值

数据结构,算法宏观印象构建

余生颓废 提交于 2019-12-01 07:08:57
数据结构,算法宏观印象构建 摘要 什么是数据结构? 为什么需要不同种类的数据结构? 数据结构的分类 什么是算法 为什么需要算法 算法性能的衡量标准 什么是数据结构? 逻辑结构:描述数据之间的关系 物理结构:描述数据存储的方式 为什么需要不同种类的数据结构? 为了更加高效的处理数据,主要体现在存储和检索方面。 如同不同的数据类型一样,通过阶梯式的定义,既有满足小数值运行的byte类型,也有支持大数值运算的long类型。这样不仅满足运算的最大支持(long),同时也能节省系统内存资源(byte)。 换句话说,数据结构和数据类型的设计目的殊途同归,都是系统资源分配优化的方案。 数据结构的分类 逻辑结构 1,集合结构 例如一个集合中包含橘子,苹果和香蕉。 集合具有三大特性: 唯一性 互斥性 无序性 2,线性结构 元素存在一对一的相互关系 3,树形结构 元素存在一对多的相互关系 4,图形结构 元素存在多对多的相互关系 物理结构 顺序存储 逻辑上相邻的节点物理上也相邻【查询效率高,插入删除效率低】 链式存储 逻辑上相邻的节点物理上不一定相邻【插入删除效率高,查询效率低】 索引存储 除建立存储结点信息外,还建立附加的索引表来标识结点的地址。 用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。 散列存储 又称hash存储

1.引入概念

a 夏天 提交于 2019-12-01 04:52:03
数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器。 那么数据结构和算法是什么?答曰:兵法! 我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,可是遇到性能瓶颈的时候,又不知该如何进行针对性的优化。 如果我们常看兵法,便可做到胸有成竹,有时会事半功倍!同样,如果我们常看数据结构与算法,我们写程序时也能游刃有余、明察秋毫,遇到问题时亦能入木三分、迎刃而解。 故,数据结构和算法是一名程序开发人员的必备基本功,不是一朝一夕就能练成绝世高手的。冰冻三尺非一日之寒,需要我们平时不断的主动去学习积累。 通过三天的学习,我们希望让大家能理解其概念,掌握常用的数据结构和算法。 引入 先来看一道题: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合? 1.1 第一次尝试 1 import time 2 3 start_time = time.time() 4 5 #

算法与数据结构9 - 哈希表

房东的猫 提交于 2019-12-01 04:38:18
哈希表   数据成员(Data Member)   操作(Operations)   哈希(Hash)   冲突(Collisions)   解决方案(Resolution) 哈希表起源:   数组查找:线性增加,时间复杂度是O(n)   我们可以通过数组索引,直接访问块(Block),这种方法的访问时间是常数   数组:     牺牲空间换取时间 ——‘holes’会吃掉很多存储空间     依赖于元素之间的顺序,元素之间的顺序将会转化为数据存储在内存空间上的顺序 来源: https://www.cnblogs.com/lvxiaoning/p/11654543.html

C语言(数据结构,DEVFORGE学编程社区)

旧巷老猫 提交于 2019-12-01 02:47:14
1、行程编码压缩算法 1 #include<stdio.h> 2 #include <string.h> 3 #define N 100 4 5 int main() 6 { 7 char s[N] = "", t[N] = "", ch; 8 gets(s); 9 10 int count = 0, index = 0; 11 for(int i=0; s[i]; ++i) 12 { 13 if(!count) 14 ch = s[i]; 15 count++; 16 if(ch!=s[i+1] || count==9){ 17 t[index++] = count+'0'; 18 t[index++] = ch; 19 count=0; 20 } 21 } 22 printf("%s",t); 23 return 0; 24 } 2、创建与遍历职工链表 1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string.h> 4 #define N 100 5 6 typedef struct node EMPLOYEE,*LIST; 7 struct node{ 8 int num; 9 LIST next; 10 }; 11 12 void Insert(LIST head,int num) 13 { 14 LIST

数据结构与算法之美

五迷三道 提交于 2019-12-01 02:16:43
数据结构与算法之美 -第一天 —如何系统高效的学习数据结构和算法 什么是数据结构?什么是算法?我们为什么要学习数据结构以及算法?学习它们对我们有什么好处? 数据结构:指的是“一组数据的存储结构” 算法:指的是“操作数据的一组方法” 数据结构和算法之间的关系: 数据结构是为算法服务的,算法是要作用在特定的数据结构上。 比较贴近生活的理解: 就好像图书馆一样,数据结构就相当于图书管理员按照类别和一定编号规律所存放的书籍 如何查找某一本书?我们可以一本一本的查找,也可以按照书籍的类别、编号来查找,笼统的讲这些查找方法都可以称之为算法。 我们为什么要把它们放在一起讲? 算法和数据结构是相辅相成的,数据结构是为算法服务的,算法要作用于特定的数据结构,因此我们无法抛开算法讲数据结构,亦或反之。 举个例子: 因为数组具有随机访问的特点,所以常用的二分查找算法需要用数组来存储数据。但是如果我们选用链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。 学习的重点在哪里? 学习算法首先要掌握一个数据结构以及算法中最重要的概念———复杂度分析。 这个概念有多重要呢?它几乎占了算法和数据结构的半壁江山,也是数据结构和算法学习的精髓。 附赠一张思维导图: 来源: https://www.cnblogs.com/it-chen/p/11647532.html