Matlab:从“中随机选择”;“缓慢变化”;索引集

Matlab:从“中随机选择”;“缓慢变化”;索引集,matlab,data-structures,Matlab,Data Structures,我想找到或实现一个Matlab数据结构,使我能够高效地完成以下三件事: 随机均匀地检索一个元素 添加新元素 删除一个元素。(如果有帮助的话,这个元素只是从结构中“检索”出来的,所以我可以使用它的位置和值来删除它) 因为我不需要重复,这个结构在数学上等价于一个集合。而且,我的元素总是1到2500之间的整数;这是不寻常的设置是这样的整个范围 什么是这样的数据结构?我曾想过使用containers.Map或java.util.HashSet之类的东西,但我不知道如何满足本例中的第一个要求,因为我不

我想找到或实现一个Matlab数据结构,使我能够高效地完成以下三件事:

  • 随机均匀地检索一个元素
  • 添加新元素
  • 删除一个元素。(如果有帮助的话,这个元素只是从结构中“检索”出来的,所以我可以使用它的位置和值来删除它)
因为我不需要重复,这个结构在数学上等价于一个集合。而且,我的元素总是1到2500之间的整数;这是不寻常的设置是这样的整个范围

什么是这样的数据结构?我曾想过使用containers.Map或java.util.HashSet之类的东西,但我不知道如何满足本例中的第一个要求,因为我不知道如何有效地检索这样一个结构的第n个键。当然,普通阵列可以满足第一个要求,但由于调整大小效率低下,对于第二个和第三个要求,它是一个不好的选择

为了了解我为什么要这样做,在当前的一些代码中,我花了大约1/4的运行时间来做:

find(x>0,Inf)
然后从这个向量中随机检索一个元素。然而,在我的程序的每次迭代中,这个向量的变化非常小,并且是以一种非常可预测的方式。因此,我更愿意随身携带一个数据结构,并在运行时对其进行更新,而不是每次都重新计算它

如果您熟悉Haskell,实现我希望支持的操作的一种方法是

randomSelect set = fmap (\n -> elemAt n set) $ randomRIO (0,size set-1)

连同插入和删除,从。但是我还有其他原因不在这个项目中使用Haskell,而且我不知道如何实现数据的后端。请自己动手。

通常,降低时间复杂度的最佳方法是增加空间复杂度。考虑到你们的电视机将相当小,我们可能可以多用一点空间

要包含集合本身,可以使用预分配数组:

maxSize = 2500;
theSet = zeros(1, maxSize);    % set elements
setCount = 0;                  % number of set elements
然后,可以使用辅助数组检查集合成员资格:

isMember = zeros(1, maxSize);
要将新元素
newval
插入集合,请将其添加到集合的末尾,并增加计数(假设有空间):

获取集合的随机元素很简单,只需:

randidx = randi(setCount);
randelem = theSet(randidx);

所有操作都是
O(1)
,唯一真正的缺点是我们必须携带两个大小为
maxCount
的数组。因此,您可能不希望将这些操作放在函数中,因为最终会在每次函数调用时创建新数组。最好将它们内联,或者更好的是,将它们包装在一个漂亮的类中。

元素的顺序重要吗?你总是随机选择元素吗?插入元件时是否必须检查重复?@bicker顺序无关紧要。检索总是随机的。我需要防止重复,结构为我做这件事会很方便,但如果必要的话,我可以用不同的方法来做。太好了,这就是我需要知道的。这很聪明,使用计数器将数组转换为分区。这让我想起了函数式编程中的一些拉链。谢谢!
assert(delidx <= setCount, 'Tried to remove element beyond end of set.');
isMember(theSet(delidx)) = 0;
theSet(delidx) = theSet(setCount--);
randidx = randi(setCount);
randelem = theSet(randidx);