<h2>解决方案</h2>
<p>另一种可能让您更快获得结果的方法:</p>
<p>首先对值进行排序,然后对其进行迭代以找到最小差异:</p>
<pre class="lang-py prettyprint-override"><code>def minAbsDiffSorted(arr):
sorted_arr = sorted(arr)
min_val = sorted_arr[-1] - sorted_arr[0]
for i, j in zip(sorted_arr[:-1], sorted_arr[1:]):
min_val = min(min_val, j - i)
return min_val
</code></pre>
<p>使用numpy执行相同操作的速度更快:</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
def minAbsDiffNumpy(arr):
return np.diff(np.sort(np.array(arr))).min()
</code></pre>
<h2>机制</h2>
<p>要处理的阵列:</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
import random
arr = np.array([random.randint(0, 100) for _ in range(20)])
>>>
array([55, 76, 88, 2, 68, 9, 24, 50, 15, 86, 19, 31, 80, 39, 14, 48, 32,
32, 35, 26])
</code></pre>
<p>让我们对数组进行排序:</p>
<pre class="lang-py prettyprint-override"><code>arr = np.sort(arr)
>>>
array([ 2, 9, 14, 15, 19, 24, 26, 31, 32, 32, 35, 39, 48, 50, 55, 68, 76,
80, 86, 88])
</code></pre>
<p>获取值之间的差异:</p>
<pre class="lang-py prettyprint-override"><code>np.diff(arr)
>>>
array([ 7, 5, 1, 4, 5, 2, 5, 1, 0, 3, 4, 9, 2, 5, 13, 8, 4,
6, 2])
</code></pre>
<p>取这些差值中的最小值,在本例中为0。这相当于原始阵列成对组合的最小距离</p>
<h2>时代</h2>
<p>以下是我的机器上的相应时间:</p>
<pre><code>%%timeit
minAbsDiff1(arr)
17.3 s ± 438 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
minAbsDiff2(arr)
19.1 s ± 1.16 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
minAbsDiffSorted(arr)
7.85 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
minAbsDiffNumpy(arr)
444 µs ± 3.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>
<h2>解释</h2>
<p>有关其背后的原因,请参见@Yves Daoust的详细解释</p>
<p>是的,使用组合也可以对结果进行排序。然而,主要的操作不是排序,而是自己进行组合</p>
<p><a href="https://stackoverflow.com/a/53422646/7648578">Here</a>您可以阅读有关<code>itertools.combinations</code>时间复杂性的更多信息</p>
<p>与此相比,这里最昂贵的操作是排序,仅此而已</p>