在排序的二维数组中搜索数字

Search a number in a sorted 2D array

我试图在二维数组列表中找到我要查找的数字。但是,在搜索之前必须先排序。

当我尝试在二维数组中查找数字时,似乎一切正常。这只是以一种仍然有效的方式对二维数组进行排序的事实。假设我想对一个 3x3 二维数组进行排序。它应该显示的方式是:

    [[8, 27, 6],
     [1, 0, 11],
     [10, 9, 3]]

然后,我将使用二进制搜索方法在排序后的二维数组中查找数字。我的中间值将位于搜索数组的中间。

这只是一个示例,但是当我输入随机数然后对行和列进行排序时,我想要完成的事情。使用这个想法,我正在使用 Python 中的 random.randint() 库来随机化我的数字。然后,我试图在我的二维数组中进行排序,但在继续之前它并不是真正的排序。

n = 5
m = 5

def findnum_arr(array, num):
    low = 0
    high = n * m - 1
    while (high >= low):
        mid = (low + high) // 2
        i = mid // m
        j = mid % m

        if (num == array[i][j]):
            return True
        if (num < array[i][j]):
            high = mid - 1
        else:
            low = mid + 1
    return False

if __name__ == '__main__':
    multi_array = [[random.randint(0, 20) for x in range(n)] for y in range(m)]
    sorted(multi_array)

已排序:

    [[0, 1, 3],
     [6, 8, 9],
     [10, 11, 27]]

应该是排序后的二维数组。可否用sorted函数分别对行和列进行排序?

正在根据列表中的第一个索引进行排序的嵌套列表调用排序。

示例:

arr = [[8, 27, 6],[1, 0, 11],[10, 15, 3], [16, 12, 14], [4, 9, 13]]

即将 return

[[1, 0, 11], [4, 9, 13], [8, 27, 6], [10, 15, 3], [16, 12, 14]]

要按照您想要的方式执行此操作,您将不得不展平然后重塑。

为此,我会尝试引入 numpy。

import numpy as np


a = np.array(sorted(sum(arr, [])))

#sorted(sum(arr, [])) flattens the list

b = np.reshape(a, (-1,3)).tolist()

为清楚起见进行了编辑:您可以将 m 和 n 用作 np.reshape 中的参数。第一个参数 (m) 将 return 数组的数量,而 (n) 将 return 数组的数量。

在任一参数中使用 -1 意味着重塑后的数组将符合 return 另一个参数的要求。

b 会 return

[[0, 1, 3], [4, 6, 8], [9, 10, 11], [12, 13, 14], [15, 16, 27]]

终于在不使用 numpy 和避免 sum() 模块的情况下找到了合适的解决方案。

if __name__ == '__main__':
    x = 7
    multi_array = [[random.randint(0, 200) for x in range(n)] for y in range(m)]
    # one_array = sorted(list(itertools.chain.from_iterable(multi_array))) Another way if you are using itertools
    one_array = sorted([x for row in multi_array for x in row])
    sorted_2d = [one_array[i:i+m] for i in range(0, len(one_array), n)]

    print("multi_array list is: \n{0}\n".format(multi_array))
    print("sorted 2D array: \n{0}\n".format(sorted_2d))
    if not findnum_arr(sorted_2d, x):
        print("Not Found")
    else:
        print("Found")

输出:

multi_array list is:
[[40, 107, 23, 27, 42], [150, 84, 108, 191, 172], [154, 22, 161, 26, 31], [18, 150, 197, 77, 191], [96, 124, 81, 1
25, 186]]

sorted 2D array:
[[18, 22, 23, 26, 27], [31, 40, 42, 77, 81], [84, 96, 107, 108, 124], [125, 150, 150, 154, 161], [172, 186, 191, 1
91, 197]]

Not Found

我想找到一个标准库模块,我可以在其中将二维数组展平为一维数组并对其进行排序。然后,我会对我的一维数组进行列表理解并将其构建到二维数组中。这听起来很多工作,但似乎工作正常。让我知道是否有更好的方法可以不用 numpy 并且更快 :)