Rumah  >  Soal Jawab  >  teks badan

Laporan tatasusunan "tidak ditemui" walaupun ditemui: dilema carian yang mengelirukan

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粉546179835P粉546179835321 hari yang lalu537

membalas semua(1)saya akan balas

  • P粉080643975

    P粉0806439752023-12-27 15:57:11

    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.

    balas
    0
  • Batalbalas