Vâng, để bắt đầu, chúng ta hãy giả sử chúng ta đang sử dụng một hình vuông.
1 2 3
2 3 4
3 4 5
1. Tìm kiếm hình vuông
Tôi sẽ sử dụng một tìm kiếm nhị phân trên đường chéo. Mục tiêu là xác định vị trí số nhỏ hơn không thấp hơn số mục tiêu.
Giả sử tôi đang tìm kiếm 4
ví dụ, sau đó tôi sẽ định vị 5
tại (2,2)
.
Sau đó, tôi yên tâm rằng nếu 4
là trong bảng, nó là ở một vị trí một trong hai (x,2)
hoặc (2,x)
với x
trong [0,2]
. Vâng, đó chỉ là 2 tìm kiếm nhị phân.
Sự phức tạp không phải là khó khăn: O(log(N))
(3 tìm kiếm nhị phân trên phạm vi độ dài N
)
2. Tìm kiếm hình chữ nhật, cách tiếp cận ngây thơ
Tất nhiên, nó sẽ phức tạp hơn một chút khi N
và M
khác (với hình chữ nhật), hãy xem xét trường hợp suy biến này:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17
Và giả sử tôi đang tìm kiếm 9
... Cách tiếp cận đường chéo vẫn tốt, nhưng định nghĩa về đường chéo thay đổi. Đường chéo của tôi đây [1, (5 or 6), 17]
. Giả sử tôi đã chọn [1,5,17]
, sau đó tôi biết rằng nếu 9
có trong bảng thì nó nằm trong phần phụ:
5 6 7 8
6 7 8 9
10 11 12 13 14 15 16
Điều này cho chúng ta 2 hình chữ nhật:
5 6 7 8 10 11 12 13 14 15 16
6 7 8 9
Vì vậy, chúng ta có thể đệ quy! có thể bắt đầu bởi cái có ít phần tử hơn (mặc dù trong trường hợp này, nó giết chúng ta).
Tôi nên lưu ý rằng nếu một trong các kích thước nhỏ hơn 3
, chúng ta không thể áp dụng phương pháp đường chéo và phải sử dụng tìm kiếm nhị phân. Ở đây nó có nghĩa là:
- Áp dụng tìm kiếm nhị phân trên
10 11 12 13 14 15 16
, không tìm thấy
- Áp dụng tìm kiếm nhị phân trên
5 6 7 8
, không tìm thấy
- Áp dụng tìm kiếm nhị phân trên
6 7 8 9
, không tìm thấy
Thật khó vì để có được hiệu suất tốt, bạn có thể muốn phân biệt giữa một số trường hợp, tùy thuộc vào hình dạng chung ....
3. Tìm kiếm hình chữ nhật, cách tiếp cận tàn bạo
Sẽ dễ dàng hơn nhiều nếu chúng ta xử lý một hình vuông ... vì vậy hãy bình phương mọi thứ.
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17
17 . . . . . . 17
. .
. .
. .
17 . . . . . . 17
Bây giờ chúng ta có một hình vuông.
Tất nhiên, chúng tôi có thể sẽ KHÔNG thực sự tạo các hàng đó, chúng tôi có thể đơn giản mô phỏng chúng.
def get(x,y):
if x < N and y < M: return table[x][y]
else: return table[N-1][M-1] # the max
vì vậy nó hoạt động giống như một hình vuông mà không chiếm nhiều bộ nhớ hơn (với cái giá phải trả là tốc độ, có lẽ, phụ thuộc vào bộ nhớ cache ... ôi thôi: p)
[[1 1][1 1]]
:?