Untuk memulainya, mari kita asumsikan kita menggunakan persegi.
1 2 3
2 3 4
3 4 5
1. Mencari kotak
Saya akan menggunakan pencarian biner di diagonal. Tujuannya adalah menemukan angka yang lebih kecil yang tidak lebih rendah dari angka target.
Katakanlah saya mencari 4
misalnya, maka saya akan menemukan 5
di (2,2)
.
Kemudian, saya yakin bahwa jika 4
ada di tabel, itu ada di posisi baik (x,2)
atau (2,x)
dengan x
masuk [0,2]
. Nah, itu hanya 2 pencarian biner.
Kompleksitasnya tidak menakutkan: O(log(N))
(3 pencarian biner pada rentang panjang N
)
2. Mencari pendekatan yang naif dan persegi panjang
Tentu saja, ini menjadi sedikit lebih rumit ketika N
dan M
berbeda (dengan persegi panjang), pertimbangkan kasus yang merosot ini:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17
Dan katakanlah saya mencari 9
... Pendekatan diagonal masih bagus, tetapi definisi perubahan diagonal. Di sini diagonal saya [1, (5 or 6), 17]
. Katakanlah saya mengambil [1,5,17]
, maka saya tahu bahwa jika 9
ada di tabel itu ada di sub bagian:
5 6 7 8
6 7 8 9
10 11 12 13 14 15 16
Ini memberi kita 2 persegi panjang:
5 6 7 8 10 11 12 13 14 15 16
6 7 8 9
Jadi kita bisa mengulang! mungkin dimulai dengan yang memiliki lebih sedikit elemen (meskipun dalam hal ini membunuh kita).
Saya harus menunjukkan bahwa jika salah satu dimensi lebih kecil dari 3
, kita tidak dapat menerapkan metode diagonal dan harus menggunakan pencarian biner. Ini artinya:
- Terapkan pencarian biner pada
10 11 12 13 14 15 16
, tidak ditemukan
- Terapkan pencarian biner pada
5 6 7 8
, tidak ditemukan
- Terapkan pencarian biner pada
6 7 8 9
, tidak ditemukan
Ini rumit karena untuk mendapatkan kinerja yang baik Anda mungkin ingin membedakan antara beberapa kasing, tergantung pada bentuk umum ....
3. Pencarian persegi panjang, pendekatan brutal
Akan jauh lebih mudah jika kita berurusan dengan persegi ... jadi mari kita persegi.
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
Kami sekarang memiliki persegi.
Tentu saja, kami mungkin TIDAK akan benar-benar membuat baris tersebut, kami dapat dengan mudah meniru mereka.
def get(x,y):
if x < N and y < M: return table[x][y]
else: return table[N-1][M-1] # the max
sehingga berperilaku seperti persegi tanpa menempati lebih banyak memori (dengan mengorbankan kecepatan, mungkin, tergantung pada cache ... oh well: p)
[[1 1][1 1]]
?