如何用JavaScript实现top n 问题? 如python的most_common()

发布于 2022-09-06 23:32:12 字数 1221 浏览 9 评论 0

我们知道python内建模块的collections有很多好用的操作。
比如:

from collections import Counter
#统计字符串
# top n问题
user_counter = Counter("abbafafpskaag")
print(user_counter.most_common(3)) #[('a', 5), ('f', 2), ('b', 2)]
print(user_counter['a']) # 5

如果用js你会怎样实现?或者有造好的轮子里面有这样的操作?

python里面实现most_common:

    def most_common(self, n=None):
        '''List the n most common elements and their counts from the most
        common to the least.  If n is None, then list all element counts.

        >>> Counter('abcdeabcdabcaba').most_common(3)
        [('a', 5), ('b', 4), ('c', 3)]

        '''
        # Emulate Bag.sortedByCount from Smalltalk
        if n is None:
            return sorted(self.items(), key=_itemgetter(1), reverse=True)
        return _heapq.nlargest(n, self.items(), key=_itemgetter(1))

这里用到了个 _heapq 堆数据结构 也就是说它是堆来解决top n问题的,而不是遍历。 js有哪些类似的轮子

`另注:`遍历的方法可以通过str.split()实现

图片描述

其实这个问题的实质是 使用堆实现Top K算法(JS实现)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白首有我共你 2022-09-13 23:32:12

我没有用过,应该有,毕竟 npm 里那么多库,不过没检索过就是了。

我觉得对于 JS 来说,最大的问题是你不好确定是

arr.sort((a, b) => a < b);
return arr.slice(0, 3);

这样比较快还是手写一个堆排序比较快。

另外就这个问题而言,我觉得直接遍历一下字符串也行,复杂度是 O(n)。因为 JS 里也是没有 counter 方法的,哈哈。

弥繁 2022-09-13 23:32:12

如果只是对ASCII字符串(甚至是所有unicode字符串)的话,使用堆真不比直接排序来的快(堆的插入操作也是logn,n个元素同样需要nlogn的时间。)。

python使用堆来实现是为了在不确定目标范围的情况下(比如并不限定为字符串,其可能的对象范围可以非常大),这时候大顶堆的优势就提现出来了。

怪异←思 2022-09-13 23:32:12

JS 原生库里面没有priority queue, 这个得自己实现。说着找library。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文