Laporan tatasusunan "tidak ditemui" walaupun ditemui: dilema carian yang mengelirukan
P粉546179835
P粉546179835 2023-12-26 18:39:31
0
1
553

Ini adalah soalan dan jawapan biasa dengan ralat logik yang saya lihat dalam banyak soalan yang ditanya oleh pengaturcara baru dalam pelbagai bahasa.

Masalahnya ialah mencari tatasusunan untuk elemen yang sepadan dengan kriteria input tertentu. Pseudokod algoritma adalah seperti berikut:

for each element of Array:
    if element matches criteria:
        do something with element
        maybe break out of loop (if only interested in first match)
    else:
        print "Not found"

Kod ini akan melaporkan "Tidak Ditemui" walaupun elemen padanan berjaya ditemui.

P粉546179835
P粉546179835

membalas semua(1)
P粉080643975

Masalahnya ialah apabila anda mencari sesuatu secara linear melalui tatasusunan, anda tidak tahu ia tidak ditemui sehingga anda mencapai penghujung tatasusunan. Kod dalam soalan melaporkan "tidak ditemui" untuk setiap elemen yang tidak dipadankan, walaupun mungkin terdapat elemen sepadan yang lain.

Satu pengubahsuaian mudah ialah menggunakan pembolehubah untuk menjejaki sama ada anda menjumpai sesuatu, kemudian semak pembolehubah itu pada penghujung gelung.

found = false
for each element of Array:
    if element matches criteria:
        do something with element
        found = true
        maybe break out of loop (if only interested in first match)

if not found:
    print "Not found"

Python dalam pembolehubah for 循环中有一个 else: 块。仅当循环运行完成时才执行代码,而不是由于使用 break 而结束。这使您可以避免 foundnya (walaupun ia mungkin masih berguna untuk pemprosesan kemudian):

for element in someIterable:
    if matchesCriteria(element):
        print("Found")
        break
else:
    print("Not found")

Sesetengah bahasa mempunyai mekanisme terbina dalam yang boleh digunakan dan bukannya menulis gelung anda sendiri.

  • Sesetengah bahasa ​​mempunyai anysome fungsi yang menerima fungsi panggil balik dan mengembalikan nilai boolean yang menunjukkan sama ada fungsi itu berjaya untuk mana-mana elemen tatasusunan.
  • Jika bahasa mempunyai penapisan tatasusunan, anda boleh menapis tatasusunan input menggunakan fungsi yang menyemak keadaan dan kemudian menyemak sama ada hasilnya ialah tatasusunan kosong.
  • Jika anda cuba memadankan elemen dengan tepat, kebanyakan bahasa menyediakan fungsi findindex untuk mencari elemen yang sepadan.

Jika anda akan mencari dengan kerap, sebaiknya tukar tatasusunan kepada struktur data yang boleh dicari dengan lebih cekap. Kebanyakan bahasa menyediakan 集合和/或哈希表 struktur data (yang terakhir menggunakan banyak nama bergantung pada bahasa, cth tatasusunan bersekutu, peta, kamus), ini biasanya mengambil masa O(1) untuk mencari dan masa O(n) untuk mengimbas tatasusunan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan