摘要:1.概念 1)Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如小写英文字母的字典树是一个26叉树,数字的字典树是一个10叉树 2)Trie树利用字符串的公共前缀来节约存储空间,字典树存放具有公共前缀的字符串们非常节省空间,相反,对于大量没有公共前缀的字符串,用字典树存
阅读全文
摘要:1.概念 1)单例模式就是一个类只能被实例化一次 ,更准确的说是只能有一个实例化对象的类 2)为什么要有单例模式:一则,解决多线程并发访问的问题;二则节约系统资源 例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的打印任务 如在Windows中就只能打开一个任务管理器,如果不使用机制对窗
阅读全文
摘要:1.题目 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。 2.分析 1)一天总共有 60 * 60 * 24 = 86400秒 2)定义一个长度为86400的整数数组i
阅读全文
摘要:1.概念 1)哈希表(散列表)是一种根据关键字 key 去寻找值 value 的数据映射结构 2)哈希表通过一个函数把key映射到表上的一个位置(哈希地址)来存储,以加快下一次查找的速度,这个函数就叫哈希函数 3)所以说,哈希技术既是一种存储技术,也是一种查找技术 2.哈希冲突 1)对不同的关键字可
阅读全文
摘要:1.top k问题 在海量数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等 2.实例 2.1从N个无序数中寻找Top-
阅读全文
摘要:1.概念 1)所谓bitmap,就是用每一位(bit)来标记某个元素对应的value, 而key即是该元素,通常bitmap是一个int数组,用每一个int数的每一个bit来映射某个数据 2)由于采用了Bit为单位来存储数据,因此可以大大节省存储空间,适用于海量数据,且每个数据的状态(value)又
阅读全文
摘要:倒水问题 有两个容器,容积分别为a升和b升,有无限多的水,现在需要c升水。 问能否通过有限次的倒水操作,得到c升水? 解析 这类题有一个套路,小容量的杯子不断往大杯子里面倒水,大杯子满了之后就把大杯子全倒掉。先举个简单的例子,比如:3升和5升的杯子,得到4升水,下面步骤中的第一个数字表示3升杯子中的
阅读全文
摘要:1.中缀表达式 1)标准四则运算的表达式就叫中缀表达式 2.逆波兰表达式 1)逆波兰表达式(后缀表达式):字符串中只有数字和运算符,没有括号,所有运算符号位于操作数之后 3.中缀表达式转逆波兰表达式 1)运算符优先级:乘除大于加减,右括号必须匹配左括号 2)遍历中缀表达式,遇到数字,输出到后缀表达式
阅读全文
摘要:联系 1.都是一种推导算法 2.都是分解成子问题来求解,都需要具有最优子结构 区别 1.贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留; 动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解 2.贪心:如果把所有的子
阅读全文
摘要:DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visited,碰到已访问的顶点则回溯到前一顶点按原则选择另一条路径走,如果无路可走时则再次回溯,坚持此原则
阅读全文
摘要:1.定义 图由有限个顶点和它们之间的边组成 2.图的存储结构 2.1邻接矩阵 1)邻接矩阵用两个数组表示图,一个一维矩阵存储顶点,一个二维数组(称为邻接矩阵)存储边,其元素值为边的权值,如果不存在这条边则计为无穷大(可以是INT_MAX),自己到自己的边值为0 2)邻接矩阵对于边数相对顶点数较少的图
阅读全文
摘要:概念 将一个大规模的问题分解为若干小规模的相同的子问题,分而治之。 能利用分治法解决的问题有3个特性 1.原问题可以分解为若干小规模的相同的子问题 2.子问题相互独立 3.子问题的解可以合并为原问题的解 使用分治法的步骤 自顶向下分解成相同且独立的子问题,治理子问题,再向上合并子问题的解来得到原问题
阅读全文
摘要:概念 动态规划也是一种分治思想,但是与分治法不同,动态规划把原问题分解为若干子问题,然后自底向上,先求解最小的子问题,把结果存储在表格中,再求解大的子问题时,直接从表格中查询小的子问题的解,最终得到原问题的解。 能利用动态规划解决的问题有2个特性 1.最优子结构 问题的最优解包含其子问题的最优解 2
阅读全文
摘要:1.内排序和外排序 1)内排序:要排序的数据全部放在内存中 2)外排序:要排序的数据太多,不能同时放在内存中,整个排序过程需要在内存和硬盘之间进行多次数据交换 2.稳定性 如果序列中有两个元素相等,排序结束后,能够保证他们原有的相对顺序不变,那这种排序算法就是稳定的。 3.常见排序算法的稳定性 稳定
阅读全文
摘要:思想 1)快排是冒泡的升级,都是交换排序类,它增大了元素比较和交换的距离,将值较大的元素直接从前面换到后面,值比较小的元素直接从后面换到前面,而不是相邻相邻地换,从而减少了比较和交换的次数 2)每一轮排序,先选出一个枢轴,让比枢轴小的元素放在枢轴的左边,比枢轴大的元素放在枢轴的右边,再把序列分成按枢
阅读全文
摘要:图片转载自:https://www.cnblogs.com/chengxiao/p/6129630.html 思想 1)堆排序是直接选择排序的改进,同属选择排序类 2)堆是具有以下性质的完全二叉树:每个节点的值都大于等于其左右孩子节点的值,称为大顶堆(最大堆);或者每个节点的值都小于等于其左右孩子节
阅读全文
摘要:图片转载自:https://blog.csdn.net/weixin_37818081/article/details/79202115 1.几个名词解释 1)增量(步长):待处理的序列中每个元素间的距离,可自行设置 增量设置的规则: 1.常用规则:increment = increment / 3
阅读全文
摘要:思想 首先要明确的是,已排序序列在前,待排序序列在后,第一轮的待排序序列就是整个序列,每一轮将待排序序列中的首位元素插入到已排序序列的合适位置处,待排序序列元素个数减1,已排序序列元素个数加1,直到插完所有元素 代码实现 void sortInsert(vector<int> &nums) { in
阅读全文
摘要:思想 首先要明确的是,已排序序列在前,待排序序列在后,第一轮的待排序序列就是整个序列,每一轮在待排序序列中选出本轮最小的元素放在待排序序列的首位,然后将这个首位纳入已排序序列,待排序序列元素数目相应减1;不断重复上述操作,直到已排序序列长度为数组长度 代码实现 时间复杂度 最好情况O(n2),最坏情
阅读全文
摘要:思想 首先要明确的是,已排序序列在后,待排序序列在前,第一轮的待排序序列就是整个序列;每一轮都从待排序序列首部开始,比较相邻元素,如果前一个元素比后一个元素大,则交换两元素的位置,这么一轮下来,本轮最大的那个元素就到了末尾,成为已排序序列,待排序序列的元素个数相应减1,不断重复,最终达到完全有序 代
阅读全文