【问题标题】:Data structure suitable for a windowing system适用于窗口系统的数据结构
【发布时间】:2024-12-16 14:40:02
【问题描述】:

我正在开发一个自定义窗口系统,它同时显示重叠的多个窗口。

关于一个窗口的重要数据包括它的坐标(x-y坐标系中对角的两个对角)、索引(索引值最低的一个显示在所有其他窗口之上)和它的内容。

操作包括

  1. 点击(命中测试)
  2. 记录使用过的窗口的历史记录 最近
  3. 调整大小
  4. 拖动
  5. 最小化窗口(将索引更新为无穷大/最大值)
  6. 最大化窗口(将所有其他窗口索引值增加 1)

我发现Min-heap 可用于跟踪以键为索引的窗口。树的节点可以包含其他信息,例如 x-y 坐标和指向其内容的指针。

历史记录可以通过Doubly Linked Lists完成。

问题

还有哪种数据结构适合这个问题?

  1. 有没有什么数据结构可以单独解决这个问题?
  2. 如果排除最小化/最大化操作,是否有任何数据结构可以有效适应?
  3. 有谁知道如何在 Windows Family、Linux 等操作系统中跟踪窗口?

【问题讨论】:

  • 如何选择其他窗口?是否有最小化操作或者您只是选择下一个窗口?在那种情况下,当前的顶部窗口会去哪里?
  • 我认为显而易见的解决方案没有任何问题——拥有一组窗口、一组用于排序的引用和一组用于历史的标识符。

标签: data-structures


【解决方案1】:

似乎在这里使用最小堆对你没有多大好处。唯一真正有用的是告诉您哪个窗口位于 z 顺序的顶部。它不能轻易地告诉你第 2 位、第 3 位等位置有什么。

我认为您应该使用窗口的链接列表,最顶部的窗口是第一个节点,最底部的窗口是最后一个节点。

请注意,这样做不需要您为每个窗口的 z 顺序维护一个明确的数字。顺序是隐含在列表中的。

命中测试是按顺序搜索列表的简单问题。通过将窗口移动到列表的前面来最大化它。将窗口移到列表的最后,将其最小化。

对于日志记录,使用单独的链表。

调整大小和拖动不需要特殊的数据结构。

如果您想显示一个任务栏,您需要保留一个按创建顺序排列的窗口列表。否则,每次更改窗口的 z 顺序时,它在任务栏中的位置都会改变。那会……令人困惑。

我不建议尝试构建处理所有用例的单一数据结构。如果你这样做,那么如果你想改变一件事的工作方式,或者你想添加新功能,你就有可能破坏其他一切。但是,如果您使用链表进行命中测试并且想要更改历史记录的工作方式,则不会影响命中测试,因为它是一个单独的数据结构。

【讨论】: