![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
编程有了模型
一个专注于用模型树学习法搭建计算机领域基础理论知识体系的专栏。
展开
-
0925:如何学习数据结构和算法?
总结一、什么是数据结构?什么是算法?数据结构和算法的关系?1.数据结构就是一组数据的存储结构。2.算法时操作数据的一组方法。3.二者关系:数据结构是为算法服务的,算法要作用于特定的数据结构之上。数据结构是静态的,必须基于它操作和构建算法,数据结构才有意义。二、重点内容有哪些?1.复杂度分析(内功心法,核心)2.10中经典数据结构和10中经典算法(招式口诀)10个数据...原创 2018-10-12 13:37:00 · 96 阅读 · 0 评论 -
1024:二分查找(上)
目录一、什么是二分查找?二、时间复杂度分析?三、如何实现二分查找?四、使用条件(应用场景的局限性)五、思考一、什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?1.时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情...原创 2018-11-10 13:53:23 · 560 阅读 · 0 评论 -
1026:二分查找(下)
目录一、四种常见的二分查找变形问题二、代码实现三、适用性分析四、思考一、四种常见的二分查找变形问题1.查找第一个值等于给定值的元素2.查找最后一个值等于给定值的元素3.查找第一个大于等于给定值的元素4.查找最后一个小于等于给定值的元素二、代码实现前提假设:以数据是从小到大排列为前提来实现1.查找第一个值等于给定值的元素,比如在数组a[10]={1,3...原创 2018-11-10 13:57:03 · 223 阅读 · 0 评论 -
1029:跳表
目录一、什么是跳表?二、跳表的时间复杂度?三、跳表的空间复杂度及如何优化?四、高效的动态插入和删除?五、跳表索引动态更新?一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这...原创 2018-11-10 14:01:03 · 195 阅读 · 0 评论 -
1031:散列表(上)
目录一、散列表的由来?二、如何设计散列函数?三、散列冲突的解决方法?四、思考一、散列表的由来?1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计...原创 2018-11-10 14:04:08 · 320 阅读 · 0 评论 -
1102:散列表(中)
目录面试题目:如何设计一个工业级的散列函数?一、如何设计散列函数?二、如何根据装载因子动态扩容?三、如何选择散列冲突解决方法?面试题目:如何设计一个工业级的散列函数?思路:何为一个工业级的散列表?工业级的散列表应该具有哪些特性?结合学过的知识,我觉的应该有这样的要求:1.支持快速的查询、插入、删除操作;2.内存占用合理,不能浪费过多空间;3.性能稳定,在极端...原创 2018-11-10 14:07:39 · 233 阅读 · 0 评论 -
1105:散列表(下)
目录带着问题去学习一、为什么散列表和链表经常放在一起使用?二、散列表和链表如何组合起来使用?1.LRU(Least Recently Used)缓存淘汰算法1.1.LRU缓存淘汰算法主要操作有哪些?主要包含3个操作:1.2.如何用链表实现LRU缓存淘汰算法?1.3.如何使用散列表和链表实现LRU缓存淘汰算法?2.Redis有序集合2.1.什么是有序集合?2....原创 2018-11-16 21:32:18 · 172 阅读 · 0 评论 -
1107:哈希算法(上)
目录带着问题来学习一、什么是哈希算法?1.定义2.如何设计一个优秀的哈希算法?二、哈希算法的常见应用有哪些?1.安全加密2.唯一标识3.数据校验4.散列函数三、思考带着问题来学习:如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?在实际开发中,我们应该如何用哈希算法解决问题?一、什...原创 2018-11-16 21:33:43 · 350 阅读 · 0 评论 -
1109:哈希算法(下)
目录带着问题来学习:一、哈希算法在分布式系统中的应用1.负载均衡1.1.需求1.2.常规解决方案1.3.完美解决方案2.数据分片2.1.如何统计“搜索关键词”出现的次数?2.2.如何快速判断图片是否存在图库中?3.分布式存储3.1.什么是分布式存储?3.2.遇到的问题是什么?3.3.解决方案是什么?二、思考带着问题来学习:哈希算法在分...原创 2018-11-16 21:36:04 · 237 阅读 · 0 评论 -
五大常用算法汇总
1、五大常用算法之一:分治算法:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html2、五大常用算法之二:动态规划算法:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html3、五大常用算法之三:贪心算法:http://www.cnblo...转载 2018-12-05 20:38:12 · 725 阅读 · 0 评论 -
程序员的算法能力测试
这六个真实软件开发中的算法问题,你都能解决吗?乔布斯说,一个天才员工可以顶得上50个平庸的员工。但,在软件开发行业里,一个优秀靠谱的工程师,可以顶得上100个普通的工程师。普通的业务开发,有时候并不能区分一个工程师是普通还是优秀。但是,面对一些稍微复杂的技术问题,这个区分就会显得非常明显。实战测试题(一)假设猎聘网有10万名猎头顾问,每个猎头顾问都可以通过做任务(比如发布职位),来积累...原创 2018-12-12 20:56:34 · 1203 阅读 · 0 评论 -
海量数据解决思路之BitMap
原文:http://zengzhaozheng.blog.51cto.com/8219051/1404108一、概述 本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景的...转载 2018-12-16 07:19:34 · 451 阅读 · 0 评论 -
1022:排序优化
目录一、如何选择合适的排序算法?二、如何优化快速排序?三、通用排序函数实现技巧总结:如何实现一个通用的高性能的排序函数?一、如何选择合适的排序算法?1.排序算法一览表 时间复杂度 是稳定排序? 是原地排序? 冒泡排序 O(n^2) 是 ...原创 2018-10-23 15:27:32 · 243 阅读 · 0 评论 -
1019:线性排序算法
目录一、线性排序算法介绍二、桶排序(Bucket sort)三、计数排序(Counting sort)四、基数排序(Radix sort)总结:桶排序、计数排序、基数排序一、线性排序算法介绍1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法的时间复杂度为O(n)。3.此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。4.对排序数...原创 2018-10-23 15:24:05 · 370 阅读 · 0 评论 -
0926:复杂度分析
总结一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行...原创 2018-10-12 13:38:53 · 84 阅读 · 0 评论 -
0928:复杂度分析4个概念
总结一、复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上...原创 2018-10-12 13:39:48 · 130 阅读 · 0 评论 -
1001:数组
总结一、什么是数组?1.定义数组是一种线性表,它用连续的内存空间来存储多个相同数据类型的数据。怎么理解这个定义?主要从线性表、连续内存和相同数据类型三个关键词来看。2.什么是线性表?顾名思义,数据就像一条直线一样进行组织,每一个数据都只有前后两个方向,除了数组之外,队列、栈、链表也都是线性表。与线性表相对应的就是非线性表,比如树、图等。3.连续内存和相同数据类型的限制有什么...原创 2018-10-12 13:42:19 · 210 阅读 · 0 评论 -
1003:链表
总结一、什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),...原创 2018-10-12 13:44:43 · 85 阅读 · 0 评论 -
1005:链表
总结:如何优雅的写出链表代码?6大学习技巧如下:一、理解指针或引用的含义1.含义:将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值给指针(引用)。2.示例:p—>next = q; 表示p节点的后继指针存储了q节点的内存地址。p—>next = p—>next—>next; 表示p节点的后继指针存储了p节点的下下个节点的内...原创 2018-10-12 13:47:20 · 193 阅读 · 0 评论 -
1008:栈
一、什么是栈?1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。二、为什么需要栈?1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。3.所以,当某个数据...原创 2018-10-12 13:53:09 · 68 阅读 · 0 评论 -
1010:队列
总结一、什么是队列?1.先进者先出,这就是典型的“队列”结构。2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。3.所以,和栈一样,队列也是一种操作受限的线性表。二、如何实现队列?1.队列APIpublic interface Queue<T> { public void enqueue(T it...原创 2018-10-12 13:56:49 · 222 阅读 · 0 评论 -
1012:递归
总结一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。3.基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);...原创 2018-10-12 13:58:02 · 283 阅读 · 0 评论 -
0921:为什么要学习数据结构和算法?
为什么学习数据结构和算法?我认为有3点比较重要1.直接好处是能够写出性能更优的代码。2.算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。3.长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。...原创 2018-10-12 13:35:27 · 355 阅读 · 0 评论 -
1015:基础排序算法
目录一、几种经典排序算法及其时间复杂度级别二、如何分析一个排序算法?三、冒泡排序四、插入排序五、选择排序总结:冒泡排序、插入排序和选择排序一、几种经典排序算法及其时间复杂度级别冒泡、插入、选择 O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较二、如何分析一个排序算法?1.学习排序算法的思路?明确原理...原创 2018-10-22 21:57:25 · 277 阅读 · 0 评论 -
1017:归并和快排
目录一、分治思想二、归并排序三、快速排序四、归并排序与快速排序的区别总结:归并排序和快速排序一、分治思想1.分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。2.分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。二、归并排序1.算法原理先把数组从...原创 2018-10-22 22:03:43 · 516 阅读 · 0 评论 -
位运算符及其应用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hguisu/article/details/7892596 一、C语言的六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移&nb...转载 2018-12-16 07:22:52 · 528 阅读 · 0 评论