
数据结构与算法
Jean-coding
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数组-笔记
数组是什么:数组是一组线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。线性表:数据排成像线一样的结构,每个线性表上数据最多只有前后两个方向,链表、队列、栈也为线性表结构。非线性表:二叉树、堆、图。非线性是指数据不是简单的前后对应关系。为什么数组从0开始编号数组下标准确来讲指的是“偏移”,例如数组a,数组a[0]表示偏移0个type_size位置即为首地址,数组a[k]表...原创 2018-12-20 23:32:30 · 180 阅读 · 0 评论 -
如何用快排在O(n)时间内查找第K的数-笔记
我们可利用快排分区的思想解决这个问题:我们选择数组a区间的最后一个元素a[n-1]作为pivot,此时数组可分为三个区间:a[0]~a[p-1],a[p],a[p+1]~a[n-1]。若K=p+1,则p为所求。若K>p+1,则按上述思路对a[p+1]~a[n-1]区间内进行求解,若K<p+1,同理。为什么上述查找方式复杂度为n呢?第一次分区查找,我们需要对大小为n的数组进...原创 2019-01-02 22:01:29 · 566 阅读 · 0 评论 -
为什么插入排序比冒泡排序更受欢迎-笔记
我们先来看看冒泡排序代码:// 冒泡排序,a 表示数组,n 表示数组大小public void bubbleSort(int[] a, int n) {if(n&lt;=1) return;for(int i=n-1;i&gt;0;i--){ int flag=false; // 提前退出冒泡循环的标志位 for(int j=1;j&lt;=i;j++){ if(a[j]&...原创 2019-01-02 16:41:50 · 367 阅读 · 0 评论 -
如何防止数据库中的信息被“脱库”-笔记
我们可通过hash算法对用户密码加密之后再存储,不过最好选用较安全的加密算法,比如SHA(MD5据说已被破解),但仅仅这样加密就行了吗?用户信息“脱库”后,黑客利用字典攻击:维护一个常用密码的字典表,将字典中每个密码用hash算法计算hash值,如果用户“脱库”后的密文和hash值相等,基本就可以认为密文对对应的密码就是字典中的密码,为什么说是基本认为?因为可能会存在hash冲突。针对字典攻击...原创 2019-01-05 23:07:32 · 3721 阅读 · 1 评论 -
如何设计一个工业级的散列函数-笔记
何为一个工业级散列表?工业级链表有哪些特性?支持快速查找、删除、插入操作;内存占用合理,不能浪费过多内存空间;性能稳定,极端情况下,性能也不会退化到无法接受的情况。如何实现这样的散列表呢?设计一个合理的散列函数;定义装载因子阈值,并且设计动态扩容策略;选择合适的散列冲突解决方法。...原创 2019-01-04 21:49:31 · 263 阅读 · 0 评论 -
队列在线程池等有限资源池中的应用-笔记
当我们向固定大小的线程池中请求一个线程时,若线程中没有空闲资源了,这时候线程池是拒绝请求还是排队请求还是?各种处理策略如何实现?一般我们有两种处理策略:1.非阻塞方式:直接拒绝请求;2.阻塞方式:将请求排队,当有空闲线程时,取出排队的线程继续处理。我们需要对排队的请求公平处理,先来者先服务,因此队列这种数据结构很适合处理这种排队结构。队列又分为链式队列和数组队列,链表队列可支持一个无限排...原创 2018-12-25 13:54:03 · 291 阅读 · 1 评论 -
算法与数据结构时间空间复杂度分析-笔记
第一篇博客终于正式开始写了,又菜又懒的自己要开始监督自己好好学习,立个FLAG,一周至少两篇。数据结构和算法本就是用来解决“快”和“省”的问题。即要代码快速运行,又要节省空间,那么对时间和空间复杂度的分析便格外重要,尤其在数据量巨大的时候,这也是为什么BAT这种大公司面试时对算法和数据结构要求很高。我们对大O表示法都很熟悉了,这里粗略说下。它实际上并不具体表示代码真正的执行时间,而是表示代码执...原创 2018-12-19 00:04:39 · 343 阅读 · 0 评论 -
如何实现浏览器的前进后退功能-笔记
浏览器大家都很熟悉,当我们点开一系列页面例如a-b-c时,到c页面后退可以查看b、a页面,在b、a页面前进可以查看c页面,但是当在b页面重新进入一个新的页面时,此时再也不能通过前进或者后退进入c页面了,这是怎么实现的呢?很简单,两个栈即可实现此功能。1.首先,进入一系列页面a、b、c:将a、b、c依次压入栈Stack1,此时在页面c;2.后退两步:将c、b依次弹出再压入栈Stack2;3.前...原创 2018-12-24 17:16:10 · 2790 阅读 · 0 评论 -
链表实现LRU淘汰算法-笔记
首先简单介绍下链表数组需要一段连续的内存空间来存储,而链表可将一组零散的内存块串联起来使用最常见的链表有:单链表、双向链表、循环链表。链表通过指针将一组零散的内存块串联在一起,其中,内存块称为链表结点,为把所有结点串起来,每个链表结点除了存储数据外,还需要记录下一个结点地址。这个记录下一个结点地址的指针叫后继指针next。双向链表还有一个前驱指针prev指向前一个结点...原创 2018-12-23 18:27:44 · 484 阅读 · 0 评论 -
如何“三行代码”找到最终推荐人-笔记
用户A推荐B,B推荐C,我们说C的最终推荐人是A,B的最终推荐人也是A,而A没有最终推荐人,一般来说我们用**数据库**来建立这种关系,在数据库表中,我们可以记录两行数据,其中 actor_id表示用户 id,referrer_id 表示推荐人 id。![](https://img-blog.csdnimg.cn/20181226232200196.jpg?x-oss-process=image...原创 2018-12-26 23:23:42 · 660 阅读 · 0 评论 -
如何在有限的空间范围内对日志文件进行排序-笔记
现在假设我们有10个接口访问日志文件,每个日志文件大小约300MB,每个文件里的日志都是按照时间戮从小到大排列。你希望将这10个较小的日志文件,合并为1个日志文件,合并之后的日志仍按照时间戮从小到大排列。如果处理上述任务的机器内存只有1GB,你有什么好的解决思路能“快速”地将这10个日志文件合并吗?我们可以每次从各个文件中取一条最小的数据,在内存中根据数据时间戳构建一个最小堆,然后每次把最小值...原创 2019-01-02 22:23:02 · 1023 阅读 · 0 评论