在这段 Python 代码中,
fun遍历数组arr并为每个部分对计算两个数组部分中相同整数的数量。(它模拟一个矩阵。)这n*(n-1)/2*m进行了总体比较,时间复杂度为O(n^2)。
是否有编程解决方案或重新构建此问题的方法可以产生等效的结果但降低了时间复杂度?
# n > 500000, 0 < i < n, m = 100
# dim(arr) = n*m, 0 < arr[x] < 4294967311
arr = mp.RawArray(ctypes.c_uint, n*m)
def fun(i):
for j in range(i-1,0,-1):
count = 0
for k in range(0,m):
count += (arr[i*m+k] == arr[j*m+k])
if count/m > 0.7:
return (i,j)
return ()
arr 是一个共享内存阵列,因此为了简单和性能原因最好保持只读。
arr实现为来自 的一维原始数组multiprocessing。这样做的原因是,根据我的测试,它具有迄今为止最快的性能。numpy例如,使用2D 数组,如下所示:
arr = np.ctypeslib.as_array(mp.RawArray(ctypes.c_uint, n*m)).reshape(n,m)
将提供矢量化功能,但将总运行时间增加一个数量级 - 250 秒与 n = 1500 的 30 秒,即733%。
翻阅古今
海绵宝宝撒
相关分类