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

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据