topN 算法 以及 逆算法(随笔)
topN 算法 以及 逆算法(随笔)
注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据。 这就是所谓的 topN 算法。当然你可以说我就 sort 一下 排序完了直接取 slice(0, n) 不就好咯。 但是这的性能会很差~ 那到底能有多差,这篇文章会给大家一个 直观的感受。
第一步、造数据
有排序,那么必须先得有数据 才能在这基础上进行下一步的操作。
let arr = []
for (let i = 0; i < 2000; i++) {
arr.push(i)
}
console.log(arr) // [0, 1, 2, ..., 10000]
第二步、 打乱数据
ok, 现在 数据原料有了,但是呢,现在这个的排序是正常的。我们现在要做的就是打乱这 10000 个数字的顺序。 thinking , emmmmmm。 好像没什么好的办法。 思路: 既然是要随机乱排列。那么随机数 Math.random() 可以获取一个 随机数 通过这个随机数,我们可以有什么作为呢?
这个时候,我们想到了 一个 最low 的办法, sort 排序。 然后再利用 random 随机数。 好了,我们试一试
for (var m = 0; m < arr.length; m++) {
arr.sort( function() {
return 0.5 - Math.random()
})
}
console.log(arr)
没错就是这样,数据就被随机打乱了~~~ 但是性能如何呢?
我们专门来测试了一番。
第三步、 打乱数据 性能测试。
我们先从 循环 1000 来逐步加大运算量,看看我们的浏览器到哪一步会挂 =。= --- 代码如下:
let arr = []
let sTime = new Date().getTime()
console.log('第一步' + sTime)
for (let i = 0; i < 1000; i++) {
arr.push(i)
}
console.log('第二步' + arr)
console.log(new Date().getTime() - sTime)
for (var m = 0; m < arr.length; m++) {
arr.sort( function() {
return 0.5 - Math.random()
})
}
console.log('第三步' + arr)
console.log(new Date().getTime() - sTime)
(1) 1000 循环的结果:

造数据: 4 ms
打乱数据: 600 ms (多次平均值)
(2) 2000 循环的结果:


造数据: 8 ms
打乱数据: 2500 ms (多次平均值)
(3) 5000 循环的结果:


造数据: 8 ms
打乱数据: 18000 ms (多次平均值)
实在是 不想测试 10000 次 数据通过 sort 打乱的过程。 时间 tooooooo loooooooong...
第四步、 再获得 topN 个数字
我们通过 可以想到的所有方法 对上面的 2000 次计算的数据进行有效的排序。
sort()?
二叉树?
使用最大堆排序,然后取出前N名?
分成 N * 10 个数组,获取其中的最大值,再排序 ?
(1) sort() 排序法
代码如下:
arr.sort(function(a, b) {
return a - b
})
console.log('第四步' + arr)
结果:

很神奇,在仅仅只有 5000 的数据量的时候 sort 排序 速度居然也还是很快。 平均值在 6ms 左右。
(2) sort() 分成 N * 10 个数组,获取其中的最大值,再排序
晚上回家继续写~~~ 敬请期待
topN 算法 以及 逆算法(随笔)的更多相关文章
- RSA简介(四)——求逆算法
此处所谓求逆运算,是指在模乘群里求逆. 第一节里提到互质的两个定义: (1)p,q两整数互质指p,q的最大公约数为1. (2)p.q两整数互质指存在整数a,b,使得ap+bq=1. 只要明白了欧几里得 ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- Levenshtein Distance算法(编辑距离算法)
编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...
- 行为识别笔记:improved dense trajectories算法(iDT算法)(转载)
iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- MP算法、OMP算法及其在人脸识别的应用
主要内容: 1.MP算法 2.OMP算法 3.OMP算法的matlab实现 4.OMP在压缩感知和人脸识别的应用 一.MP(Matching Pursuits)与OMP(Orthogonal Matc ...
- 【强连通分量】tarjan算法及kosaraju算法+例题
阅读前请确保自己知道强连通分量是什么,本文不做赘述. Tarjan算法 一.算法简介 Tarjan算法是一种由Robert Tarjan提出的求有向图强连通分量的时间复杂度为O(n)的算法. 首先我们 ...
- Hash 算法与 Manacher 算法
目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...
- 懂了!国际算法体系对称算法DES原理
概念 加密领域主要有国际算法和国密算法两种体系.国密算法是国家密码局认定的国产密码算法.国际算法是由美国安全局发布的算法.由于国密算法安全性高等一系列原因.国内的银行和支付机构都推荐使用国密算法. 从 ...
随机推荐
- bgp选路原则【第二部】
面向逻辑谈bgp选路原则(第二部) 终于到了BGP终极解析的第二部曲--BGP选路原则.与题目相呼应,我不会直接介绍选路原则的规则,而是从时间逻辑和空间逻辑上将所有的选路原则分层分类.因为只有从这种角 ...
- 1001.A+B Format (20)的解题
关于A+B的正确打开方式! 解题思路 gitub 也是研究了很久才学会了本地上传,中间还遇到一些问题,多亏学长的教程跟搜索引擎的帮忙解决啦! 我想还是了解题目的意思是解题的最关键,通过了查词软件跟自身 ...
- 201521123002《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 1.提交函数实 ...
- 201521123011 《java程序设计》 第7周学习总结
1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源 ...
- 《JAVA程序设计》第9周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...
- 201521123011 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口: 常用应用层协议:http, ftp 域名(通过域名可以找到IP)用ping测试 ...
- Java:java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- sed命令基础
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space ...
- uvalive 3708 Graveyard
https://vjudge.net/problem/UVALive-3708 题意: 一个长度为10000的圆环上放着n个雕塑,每个雕塑之间的距离均相等,即这个圆环被n个点均分.现在需要加入m个雕塑 ...
- java 读取properties文件总结
一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResource ...