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