一站式软文发布推广平台,室内设计需要学哪些软件,有好的学网站建设的书吗,环境设计案例网站一般来说都是针对数据量特别大#xff0c;内存有限制的。
第一类#xff1a;topk问题
比如#xff0c;在海量数据中找前50大的数据怎么办#xff1f;
方法一#xff1a;使用小顶堆#xff0c;用小顶堆维护这50个元素#xff0c;当有新元素到来时#xff0c;直接与堆…一般来说都是针对数据量特别大内存有限制的。
第一类topk问题
比如在海量数据中找前50大的数据怎么办
方法一使用小顶堆用小顶堆维护这50个元素当有新元素到来时直接与堆顶进行比较小顶堆堆顶最小如果比堆顶大替换堆顶调整堆结构。
堆中含k个元素堆内部调整时间复杂度logk一共n个数据每来一个都要进行一次堆调整总的时间复杂度O(nlogk)总的空间复杂度O(k)。
方法二使用快排快排的思想是找标准值标准值左边都是比它小的右边都是比它大的返回中间标准值的位置找前k大的就在标准值的右边进行查找步骤一样先确定标准值将小于标准值的放入左侧大于标准值放入右侧
开始数据量为n进行一次二分数据量变为n/2后续只需要在这n/2中进行查找进行两次变为n/4以此类推...最终时间复杂度nn/2n/4...12n-1总的时间复杂度O(n)。
方法二同样适用无序元素中找第k大的数时间复杂度要求O(n)
第二类海量数据的两个文件找相同
比如两个文件中存放1000万电话号码找这两个文件中相同的电话号码
位图法对于电话号一共11位从10000000000~19999999999大约10G空间采用位图法该电话号存在对应为1不存在对应0将存储空间压缩到10G/81.25G。
第三类海量数据排序
比如有10GB的订单数据。希望按照订单的金额金额是整数进行排序但是内存只有几百MB无法一次性加载到内存。
方法一采用分桶排序。加入金额是0-10万分成100个桶每个桶的范围是1千。比如桶0是从0~1000桶1是从1001~2000...数据按照区域进行划分。存在100个文件中文件内部进行排序可以使用快排依次从桶0、桶1...中取元素得到的就是有序的10GB数据。时间复杂度O(nlogn/100)计算方法为100个文件每个文件进行快排每个文件数据n/100100*(NlogN)其中N为n/100最终结果为O(nlogn/100)。
存在的问题是如果数据在某个范围特别多比如某个桶有1GB的数据这种情况怎么办?
对这个桶中元素再进行分桶各桶有序再合并。
方法二将数据等分到100个文件中每个文件相当于100MB的数据每个文件内部快排。同时维护一个小顶堆。每次取堆顶可以先放入缓存最后放入文件中。 方法三文件之间两两合并相当于合并有序列表。 既然找10亿元素中的中位数就是找第5亿个、第5亿1个每个桶有相应的存储元素个数大致确定5亿、5亿1元素具体位于哪个桶再对该桶进行分桶桶的间距为1再进行查找即可。