【问题标题】:Is there a data structure in JDK that can remove, find and insert in log-N time?JDK中是否有可以在log-N时间内删除,查找和插入的数据结构?
【发布时间】:2023-03-27 00:44:01
【问题描述】:

在对 RDring 进行测试后,我发现 remove element 有时会失败,并且 移除定时器的时间复杂度是线性的;警报管理器使用 TreeSet 迭代所有要删除的元素。

然后,我查看了 PriorityQueue 的来源,猜想也许可以用它来存储计时器 列表。但我很惊讶,虽然 PriorityQueue 中的删除是在 恒定时间,优先队列中元素的插入也是线性的。 他们没有使用任何树或二进制搜索技术来加速 插入。

如果我想快速删除,那么 PQ 但插入慢。否则我可以使用 TreeSet 用于插入 log-N 但删除速度很慢。是否有任何树或堆支持 插入、删除和查找都以 log-N 速度?

【问题讨论】:

  • 谢谢,但我想知道JDK中各种数据结构的复杂性。 url 似乎只描述了数据结构的复杂性。

标签: java algorithm


【解决方案1】:

是否有任何树或堆同时支持插入、删除和以 log-N 速度查找?

是的,基于 TreeMap 的红黑树保证:

类 TreeMap

...

此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。算法是对 Cormen、Leiserson 和 Rivest 的算法简介中的算法的改编。

另见

顺便说一句,您说使用 TreeSet,删除速度很慢 - 但是,JavaDoc 还记录了 O(log(n)) 用于删除:

类树集

...

此实现为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本

【讨论】:

  • 谢谢,但我想知道JDK中各种数据结构的复杂性。 url 似乎只描述了数据结构的复杂性。
  • 对 - 通常,各个 java 实现的复杂性都记录在它们的 JavaDocs 中,就像我链接的 TreeMap JavaDoc 中一样。调整了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多