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