摘要:简介 上文中,我们讲到了选择排序,冒泡排序,插入排序,希尔排序。 都是相对比较简单的实现方式,因为它们都是以人的思维,维护一个index,将index与周围元素逐步对比。直到整个数组有序。 但越是效率高的算法,反而要越接近计算的的思维。否则非常难以突破O(N^2)的桎梏。 而接下来的几种效率高算法,
阅读全文
摘要:简介 排序算法有三个重要的指标: 时间/空间复杂度 在前面的文章中,虽然经常强调空间换时间能解决大多数问题。但如果时间与空间都比较小,自然是更好的选择。 排序稳定性 相同的元素,如果排序之后相对位置没有发生改变,那可以被称为稳定排序,否则就是不稳定排序。 比如说两个相同的数,排序前它们的顺序是 a
阅读全文
摘要:简介 上文讲到,图的本质是多叉树。因此主要遍历方式还是DFS与BFS。 唯一的区别在于,树结构中不存在环,而图中可能回成环。因此我们需要记录一下已经访问过的节点,避免死循环。 深度优先遍历(DFS) 遍历所有节点 /// <summary> /// 邻接表实现DFS /// </summary> /
阅读全文
摘要:简介 图结构本质上还有多叉树的变种,图结构在逻辑上,由于若干个节点和边组成。但在实际落地中,一般用邻接表,邻接矩阵来存储图 在标准的树结构中,一般都是单链表表示,即只允许父节点指向子节点,两个子节点之间也不允许互相指向。 而图中,则是双链表放飞自我版,既可以父子之间互相指向,又可以子节点互相链接,形
阅读全文
摘要:挖坑待埋 由于二叉树有很多变种,目前只提供逻辑概念,具体实现日后慢慢补充 二叉搜索树 上文简单的介绍了一下二叉搜索树(BST),这个树可以说是梦的起点。无数高性能搜索方案,底层核心都是基于BST来构建。 那二叉搜索树有什么优势呢? 它的优势即左小右大,左子树的每个节点都小于当前节点,右子树的每个节点
阅读全文
摘要:简介 二叉树作为链表的衍生,本身不难。但它同样是其它复杂数据结构的前身。比如红黑树,多叉数,二叉堆,图,字典数等等。如果不熟悉二叉树,就会陷入一个难者不会,会者不难的境地。 几种简单的二叉树 树的顶点(1),一般称为根节点,下方直接相连的节点称之为子节点,上方直接相连的节点称之为父节点,最下方没有子
阅读全文
摘要:简介 hash的基本原理,可以理解为一个加强版的数组。为什么这么说呢,数组通过index来实现随机访问Log(1),而hash的key也是类似,把key理解为index,本质上还是一个基于数组的随机访问。 那么问题来了,如何把hash的key转换成数组的index呢? hash函数如何实现 hash
阅读全文
摘要:简介 上文说到,数据结构只有两种。其它的数据结构都是它的整花活。 栈 栈只能在表的一端(称为栈顶)进行插入和删除操作,遵循 “后进先出”(Last In First Out,LIFO)的原则。就像生活中的一摞盘子,最后放上去的盘子会最先被拿走 队列 它只允许在表的一端进行插入操作(队尾),在另一端进
阅读全文
摘要:简介 数据结构的本质,只有两种结构,数组与链表。其它的都是它的衍生与组合 算法的本质就是穷举。 数组 数组可以分为两大类,静态数组与动态数组。 静态数组的本质是一段连续的内存,因为是连续的,所以我们可以采用偏移量的方式来对元素实现快速访问。 而动态数组则是对静态数组的封装,使得更加方便操作元素。有了
阅读全文