数据结构&算法
朱又炖粉条
这个作者很懒,什么都没留下…
展开
-
二叉树的层次遍历
要进行层次遍历,需要建立一个循环队列。先将二叉树头结点入队列,然后出队列,访问该结点,如果它有左子树,则将左子树的根结点入队;如果它有右子树,则将右子树的根结点入队。然后出队,对出队结点访问,如此反复,直到队列为空为止。层次遍历函数如下:/*树的层次遍历。需要建立一个队列,直到队列为空为止。*/void Level(BTNode *p){ if(p!=NULL) { ...原创 2018-10-04 18:53:25 · 181 阅读 · 0 评论 -
模式串匹配的BF算法和KMP算法
KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。为了解决模式匹配问题,也即寻找模式串(子串)在主串中第一次出现的位置,若模式串在主串中不存在则返回-1。简单的模式匹配算法(BF算法)对于简单的模式匹配,也即暴力破解,我们的想法是:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。两个变量i和j分别记录主...原创 2018-10-08 15:05:38 · 5911 阅读 · 2 评论 -
排序算法总结
1.插入类的排序直接插入排序 折半插入排序 希尔排序2.交换类的排序冒泡排序 快速排序3.选择类的排序简单选择排序 堆排序4.归并类的排序(二路)归并排序5.基数类的排序基数排序(基于多关键字的思想) 直接插入排序插入排序:从第一个元素开始,可以认为该元素已经排好序。取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排...原创 2018-10-15 17:13:41 · 213 阅读 · 0 评论 -
链表的翻转(迭代法 递归法)
链表翻转常见的方法分为递归和迭代两种。我们知道迭代是从前往后依次处理,直到循环到链尾;而递归恰恰相反,首先一直迭代到链尾也就是递归基判断的准则,然后再逐层返回处理到开头。总结来说,链表翻转操作的顺序对于迭代来说是从链头往链尾,而对于递归是从链尾往链头。下面我会用详细的图文来剖析其中实现的细节。1、迭代方式 迭代的方式是从链头开始处理,如下图给定一个存放5个数的链表。 首先对于...原创 2018-08-02 20:29:00 · 728 阅读 · 0 评论 -
算法时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)原创 2018-10-21 16:45:56 · 332 阅读 · 0 评论 -
一致性哈希算法及其应用
一致性哈希 普通的哈希算法使用取余操作:hash(o) mod n,其中 n 代表机器的数量。如果在集群中新增加一个节点时,计算公式会变为:hash(o) mod (n+1);在集群中删除一个机器时,计算公式变为:hash(o) mod (n-1)。所以当集群中机器数量有所变化时,几乎所有的 Object 的哈希值都会改变。一致性哈希可以保证当从集群中删除一台机器时,仅仅保存在该机器上的 Ob...原创 2018-11-24 17:21:52 · 2574 阅读 · 0 评论 -
BitMap算法
先看一个场景:如何判断一个数是否在40亿个整数中?题目:给一台普通PC,2G内存。我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做?分析:40亿个int占(40亿*4字节)/1024/1024/1024 大概为16G左右,很明显内存只有2G,放不下,因此不可能将这40亿数据放到内存中计算。要快速的解决这个问题最好的方案就是将数据搁内存了,所以现在的...原创 2019-08-25 13:17:01 · 220 阅读 · 0 评论