学动规的过程中,分清动规、贪心、递归、递推是一个漫长的过程,而且正如初学动规时队长所说,动规的问题也许难点并不在动规本身,而更难的是如何判断一个问题是动规问题。今天小有所得,遂记之。
哈夫曼编码是用于数据文件压缩的一个非常有效的编码方法。其压缩率通常在20%到90%之间。哈夫曼算法使用一个字符在一个文件中出现的频率表来建立一个用0,1串表示各字符的最有表示方法,试图以最少的01串表示出现频率最高的字符,以较长的01串表示出现频率较低的字符,以降低整个文件的存储空间。
在一个有序数组中查询一个最大的数最优的时间复杂度是多少? O(logn) 在一个无序数组中查询一个最大的数最优的时间复杂度是多少? O(n) 在一个无序数组中查询一个最大数和一个次大数的最优时间复杂度是多少? 能否在n+logn-2次比较重完成? 根据题意出现logn,则肯定用到二分或者堆的思路,但是输入的数没有经过排序,而且题目要求的计算量也不允许排序。这样,就肯定会用到类似堆的思路,但是直接构造堆等同于排序。 堆的思想跟竞标赛类似,都是父节点>=(<=)子节点。如果父节点都是从子节点而来,这样就是竞标赛;如果不是,这样就是堆。
堆(Heap)不是一个序列式容器,在C++中也不属于STL容器是组件 堆是幕后英雄,在python中有一个模块为heapq,意思是用heap实现的 priority queue,实际上是一个小顶堆。在排序算法中有堆排序,在Topk算法中,大顶堆\小顶堆更是功不可没 本文参考python源代码,了解堆的实现与使用
给定两个具有n个元素的数组X和Y,X和Y已排好序,X+Y的中位数,共2n个元素,期望lnN级别的解决 易知,中位数两边的数都是n个,那么假设该中位数是X[mid],则其左边的数构成为:``X[0:mid-1]+Y[0:n-1-mid]``,其右边的数构成为:``X[mid:n-1]+Y[mid:n-1]``,故可知中位数X[mid]满足条件如下:
分治与递归是计算机处理问题解决问题两大法宝 整数划分涉及三个问题: 1、将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于m 2、将正整数划分成连续的正整数之和 3、将正整数进行因子分解
最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: