Python - 排序数组以进行搜索的最有效方法

时间:2017-02-17 11:25:14

标签: python arrays numpy search data-structures

我有一个非常大的numpy数组,看起来像这样(前5个条目):

[[ 1.    0.01  0.02  0.6   0.01  0.5   0.01  0.5   0.5   0.5 ]
 [ 0.5   0.01  0.01  0.6   0.01  0.5   0.5   0.5   0.5   0.6 ]
 [ 0.6   0.01  0.5   0.5   0.5   0.5   0.7   0.01  0.01  0.  ]
 [ 0.01  0.5   0.8   0.02  0.02  0.81  0.01  0.77  0.02  0.01]
 [ 0.5   0.02  0.5   0.    0.5   0.5   0.01  0.6   0.01  0.  ]]

搜索此数组以查找长度为10个值的特定序列。 所以我在没有特殊规则后存储传入的序列,只有0 1 2 3 ...而且我搜索这个数组。这是我的搜索方法(silo_arrays [] []是上面的数组,array_pattern []是一个1D numpy 10值长数组,我搜索silo_arrays)

   new_pattern=True
   for z in range(0, self.silo_arrays_c):
    eq_rate = 0
    for y in range(0, self.length):
        if(self.silo_arrays[z][y] != array_pattern[y]):
            break
        else:
            eq_rate += 1

    if(eq_rate == self.length):
     new_pattern = False
     break

如果silo_arrays类似于1585个条目,则大约需要0.006257个。有没有人想过如何通过某种排序结构变化 加速此搜索过程? 感谢您的支持:)

1 个答案:

答案 0 :(得分:1)

在数据优化方面,您经常处理权衡取舍而不是整体加速。

因此,在使用以下解决方案之前,请确保您了解随之而来的限制,即增加写入时间。

一种流行的算法是实现二进制搜索。如果您不熟悉这个概念:

给定一个有序的数字列表 L 和一个数字 v ,你必须检查v in L。您可以这样做,将列表分成两半,然后将这两个间隔的中间值与您的值 v 进行比较。假设升序,您将根据以下规则选择 I 区间:if v < L[middleindex]: I = lower_half else I = upper_half然后重复继续搜索。这样可以将搜索空间降至最低。

为了在项目中使用二进制搜索,您需要在将数组插入数组时对其进行排序。要比较的值将是您的数组元素的降序。这样你可能会提高搜索速度。

使用二进制搜索的好处在于,在两种情况下(最差和最佳情况),它都执行相同的操作,即 O(log n)。这使它非常可靠。

借口格式化,我在移动设备上。