免责声明:这不是一个真正的建议,它只是实际获得 O(1) 运行时的愚蠢方法
是的,在给出免责声明的情况下,实际上可以在“Matlab”中创建一个 O(1) 的弹出命令。解决方案是不在 Matlab 中,而是在 Python 中。使困惑?
基本上,您可以使用 py.list() 将向量转换为 Python 列表,然后可以执行 O(1) pop 命令。因此,您可以执行以下操作:
a = randn(1,1e4);
li=py.list(a);
b = li.pop;
但是,正如您可能已经猜到的那样,通过 Matlab 进行类型转换和运行 python 并不是我所说的快速。因此,即使我们可以保持一个恒定的运行时间,但该常数太大而无法使用。
在图中,蓝色是 Matlab/Python 解决方案,而红色(-ish)是最佳解决方案,由 Tommaso 和 Cris 给出。
很明显,我们保持看起来像 O(1),但要付出代价。
参考代码:
num_averages = 100;
num_sims = 10000;
time_store = nan(num_sims, num_averages);
for i = 1:num_averages
building_array = rand(1,num_sims);
li = py.list(building_array);
for j = 1:num_sims
tic;
li.pop;
time_store(j, i) = toc;
end
end
编辑:这种方法比纯 Matlab 解决方案更快的大小实际上在某个合理的限制范围内,约为 150000。
注意:由于我的耐心耗尽,这个数字的波动更大,因此我将平均数减少到 5 个。
别搞错了,这个解决方案仍然很愚蠢,不应该使用。转换在大小上是线性的,再次转换会更加破坏它。因此,该解决方案实际上更好的唯一情况是,如果您仅对弹出的元素感兴趣,但在这种情况下,带有索引的 for 循环可以更快地完成相同的事情。