当前位置: 首页 > 知识库问答 >
问题:

Timsort堆栈不变量-为什么要尽可能长时间地延迟合并?

隗和裕
2023-03-14

我试图理解Timsorant算法,但我无法遵循实现堆栈不变量的原因:

  1. A

根据本文件,

我们希望尽可能长时间地延迟合并,以利用稍后可能出现的模式,但我们更希望尽快进行合并,以利用刚刚发现的运行在内存层次结构中仍然很高的情况。

我知道我们希望尽快进行合并,以利用缓存效应,但我不理解为什么我们要推迟合并。他说的“模式”是什么意思?

共有1个答案

淳于升
2023-03-14

这里的模式是指正在排序的数据中的模式。例如,Timsort正在寻找增加(或减少)数据中的运行,这些运行要么已经排序,要么可以通过反转运行进行简单排序。然后,它尝试将这些运行用于其mergesort分区。

顺便说一句,维基百科上关于Timsort的文章可能对你有用:https://en.wikipedia.org/wiki/Timsort

 类似资料:
  • 条款32: 尽可能地推迟变量的定义 是的,我们同意C语言中变量要放在模块头部定义的规定;但在C++中,还是取消这种做法吧,它没必要,不自然,而且昂贵。 还记得吗?如果定义了一个有构造函数和析构函数的类型的变量,当程序运行到变量定义之处时,必然面临构造的开销;当变量离开它的生命空间时,又要承担析构的开销。这意味着定义无用的变量必然伴随着不必要的开销,所以只要可能,就要避免这种情况发生。 正如我所知道

  • 我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码: 我的SchduledExecutorService构造函数: 这是对其调度方法的调用(由日志包围): 日志允许我看到,“计划前”和“设置清除…”之间只有20-30毫秒的延迟,而不是我预

  • 问题内容: 我很难处理Java垃圾回收问题并解释日志。 我的应用程序要求GC的时间不要超过2秒,理想情况下是少于100ms。 根据先前的一些建议,我正在尝试以下命令行选项: 该应用程序具有大量长期存储的对象,这些对象保存在ConcurrentLinkedHashMap中。我偶尔会出现长时间的停顿,在最坏的情况下可能会长达10秒(这是倒数第二次,如下面的GC日志所示)! 这是我得到的一些输出: 我已

  • 问题内容: 为什么说java中的静态变量尽量不要使用? 问题答案: 静态变量表示全局状态。这很难推理,也很难测试:如果创建对象的新实例,则可以在测试中推断其新状态。如果我使用的代码使用的是静态变量,则它可能处于任何状态-任何事情都可能对其进行修改。 我可以继续进行一段时间,但是要考虑的更大概念是,事物的范围越紧密,就越容易进行推理。我们善于思考小事情,但是如果没有模块化,就很难对一百万行系统的状态

  • 我经常看到两个参与者之间有很长的延迟(60+秒),从第一个参与者发送消息到第二个参与者,以及第二个参与者的方法随消息实际调用时。我可以寻找哪些类型的东西来调试这个问题? ActorA的每个实例都使用为ActorB发送一条消息。在ActorA中调用方法并在ActorB的开始处获得另一个时间戳之后,我立即收集了一个毫秒时间戳(使用)。这些时间戳之间的间隔一致为60秒或更长。具体地说,当按时间绘制时,该

  • 问题内容: 我的用例需要一个数据结构。我应该能够将项目推送到数据结构中,而我只想从堆栈中检索最后一个项目。该堆栈的JavaDoc说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如: 我绝对不希望这里出现同步行为,因为我将使用方法本地的数据结构。除了这个,我为什么还要在这里呢? PS:Deque的Javadoc说: 双端队列也可以用作LIFO(后进先出)堆栈。