java优先级对接_java – 高效的优先级列表

堆似乎非常合适,看起来你错了.

假设您想要前x个元素(这个x与n相比如何,顺便说一下?)

你正在做的是将所有进入最大堆并获得顶部x.

我建议你使用精确x个元素的最小堆.

您插入堆中的第一个x元素.

下一个传入元素,您可以与堆中的min进行比较,该min可以非常快速地完成(O(1)时间).如果更小,则只需忽略传入元素.

如果传入元素大于min,则将min增加到传入元素并在堆中将其向下移动.这应该是最差的logx时间.

完成后(在nlogx时间内),您可以在O(xlogx)时间内按排序顺序检索堆中的元素.

根据您的数据的方式(以及x的小小),使用这种最小堆解决方案可能非常快.

如果你真的真的希望插件超快并且不太关心检索,那么你也可以做以下事情.

按照它们的顺序将元素插入到矢量(具有分摊的O(1)插入时间的数组中).

使用Selection算法查找第x个最大元素(在O(n)时间内,但常量可能很大).说这个数字是S.

现在遍历数组,将每个元素与S进行比较,并选择与S一样大的数组.

如果x的大小合理且与n相当(如n / 2或其他东西),这可能会很好,但如果x比n小,我建议使用min-heap.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值