【问题标题】:Keeping a list of array elements in certain state将数组元素列表保持在特定状态
【发布时间】:2018-05-11 10:34:58
【问题描述】:

我有一长串元素。这是一个嵌入式平台,每个周期我都需要对所有设置了一些标志的元素进行操作。

任何时候只有少数元素设置了标志。由于性能原因,我无法运行整个阵列。

我意识到一种解决方案可能是构建具有标志集的元素的数组索引列表,并遍历该列表而不是整个数组。然后,每次设置/重置标志时都会更新此列表。

我猜这是一个古老且“已解决”的问题,但我缺少正确描述它的词汇。这个问题的最佳实践是什么?它叫什么?

谢谢

【问题讨论】:

  • 何时设置标志?您可以创建一个指针队列,该队列指向设置了标志的元素。当一个标志被设置时,一个指针被添加到队列中。另一个任务可以获取队列并对元素做任何你想做的事情。

标签: arrays indexing lookup


【解决方案1】:

你要找的词是一个集合。您将标记的那些保留在某种子组(您称之为列表)中是正确的,但是列表是有序的。您不需要这种排序功能来存储一堆标记的元素;你想要一个集合,它是你数组中所有元素的子集。

不将它们排序会给您带来性能优势,尤其是在删除时,因为您不必移动列表中删除元素之后的所有元素。同样在随机位置访问中,如果您使用 HashSet,您将拥有恒定的时间。有点“坏”的一面是,遍历集合对象通常不如列表直观,这使您使用 Iterator 对象。

【讨论】:

  • 谢谢,知道这个名字给了我我正在寻找的线索。我在一个不允许指针和动态内存分配的平台上,所以我需要使用另一个数组来实现子集。关于为此使用数组的任何缺点或陷阱?我猜的一个缺点是我不知道到底有多少元素被标记,所以我不知道子集数组需要多大?我在想子集数组可能是一个环形缓冲区?谢谢
  • 为此使用简单的数组会有缺点。您将浪费时间重新发明管理这个新数组所需的典型收集方法,例如用于检查您的元素之一是否被标记的“包含”方法。但更糟糕的是你会损失很多性能(如果你不想编写散列函数和某种复杂的数据结构),因为没有字典功能,例如查找一个元素,你将不得不遍历所有标记的元素,而不是在恒定时间内访问它。
  • 此外,您还需要记录在给定时间有多少标记元素,如果不这样做,您必须分配与起始数组一样多的元素有动态分配。使用缓冲区是没有意义的,如果您可以在缓冲区填满时丢弃旧数据,但您不能丢弃标记的元素,则缓冲区很有用。您可以做的是维护您的子数组按某些东西排序,每次插入/删除元素时重新排序(这在性能方面是昂贵的)。这样你就有 log(n) 时间来检查一个元素是否在你的子数组中或者没有使用二分搜索。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2016-10-19
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多