【发布时间】:2012-03-13 09:37:48
【问题描述】:
我需要执行如下代码块:
x = some_number;
y = some_other_number;
u = a_vector_of_numbers;
v = another_vector_of_numbers;
% u and v are of equal size
r1 = ((x == u) | (x == v)); % Expensive!
r2 = ((y == u) | (y == v)); % Expensive!
q = any(r1 & r2);
您可以将其视为:x 和 y 是图上的两个节点,除非我弄错了,否则这会检查 x 和 y 是否使用邻接列表 [r1, r2] 连接。换句话说,我试图回答这个问题:“是否有这样一个索引i 可以在r1(i) 或r2(i) 找到x 和y?”
我需要反复这样做。 r1 和 r2 都可能包含多达数千个唯一值(图中的节点数约为 104),它们的长度为数十万( 106) 的顺序。
我的分析器告诉我,我用 cmets 指示的两行消耗了 99% 的运行时间,而且我的程序需要很长时间才能运行,所以我想知道:这还能优化多少?最小计算时间的基本限制是什么,我离它有多近?
此外,将此特定代码外包给另一种语言也很容易。这样做能带来显着的性能提升吗?
【问题讨论】:
-
这样的
i可以有多个吗?如果是这样,您需要全部还是只需要第一个/最后一个? -
理论上,我的数据中不应该有多个这样的
i,因为我的图表是无向的。在实践中,数据有时是脏的。无论如何,我什至不需要第一个或最后一个——我只想知道这样的i是否存在。但是,如果您的答案依赖于它,则可以对r1/r2进行一些预处理,并保证对于任何给定的x-y对,这样的i永远不会被发现超过一次.
标签: database matlab search optimization