topK算法(待完善
链接: https://gist.githubusercontent.com/tyrchen/32c50aadca48aee3da10a77a18479517/raw/3aa07629e61239cd26cf514584c949a98aa38d67/movies.csv 按照rank排序,取前topK
/**
*
* @param {*} data 获取到的数据
* @param {*} num 取top num个
*/
let top = (data, num) => {
let res = [];
let dataArr = data.split('\n');
let dataLength = dataArr.length;
for (let i = 0; i < dataLength; i++) {
// 处理脏数据
// example: "27, most popular",127.6053254325764,6.03051434574081
if (dataArr[i].match('"')) {
dataArr[i] = dataArr[i].replace(/".+"/, i);
}
dataArr[i] = dataArr[i].split(',');
dataArr[i][2] = parseFloat(dataArr[i][2]);
// 每次循环的时候进行一次rank从小到大的排序
res.sort((a, b) => {
return a[2] - b[2];
});
// 首先把数据填满到num个
if (i > 0 && res.length < num) {
res.push(dataArr[i]);
}
// 如果比数组中rank最小的还要大,就替换res中rank最小的
if (res.length === num && dataArr[i][2] > res[0][2]) {
res[0] = dataArr[i];
}
}
console.log(res);
}
top(data, 20);
这里的做法利用了Array.sort的函数。 现在回想一下,好像不太对。直接sort排序,取一下前10不就可以了么。应该正常写一个快排。脏数据的处理,还差一个10e-1这种。(parseFloat好像也会给处理掉) 总结一下,要改进的问题。 1.写一个request请求,拿到原始数据。 2.使用快排重写 3.尝试是否能用js写一个Java的PriorityQueue