Diberikan saya memiliki array BESAR, dan nilai darinya. Saya ingin mendapatkan indeks nilai dalam array. Apakah ada cara lain selain menelepon Array#index
untuk mendapatkannya? Masalahnya berasal dari kebutuhan untuk menyimpan array yang sangat besar dan menelepon Array#index
berkali-kali.
Setelah beberapa percobaan, saya menemukan bahwa caching indeks di dalam elemen dengan menyimpan struct dengan (value, index)
field alih-alih nilainya sendiri memberikan langkah besar dalam kinerja (20x kali menang).
Masih saya bertanya-tanya apakah ada cara yang lebih nyaman untuk menemukan indeks elemen en tanpa caching (atau ada teknik caching yang baik yang akan meningkatkan kinerja).
ruby
arrays
performance
indexing
gmile
sumber
sumber
Mengapa tidak menggunakan index atau rindex?
sumber
Jawaban lain tidak memperhitungkan kemungkinan entri terdaftar beberapa kali dalam sebuah larik. Ini akan mengembalikan hash di mana setiap kunci adalah objek unik dalam larik dan setiap nilai adalah larik indeks yang sesuai dengan tempat tinggal objek:
Ini memungkinkan pencarian cepat untuk entri duplikat:
sumber
Apakah ada alasan bagus untuk tidak menggunakan hash? Pencarian adalah
O(1)
vs.O(n)
untuk larik.sumber
#keys
hash, yang mengembalikan array yang saya gunakan. Namun, saya mungkin akan memikirkan arsitektur saya juga ...Jika itu adalah array yang diurutkan, Anda dapat menggunakan algoritma pencarian Biner (
O(log n)
). Misalnya, memperluas kelas Array dengan fungsionalitas ini:sumber
Dengan menggabungkan jawaban @ sawa dan komentar yang terdaftar di sana, Anda dapat mengimplementasikan indeks "cepat" dan rindex pada kelas array.
sumber
Jika array Anda memiliki tatanan natural, gunakan pencarian biner.
Gunakan pencarian biner.
Pencarian biner memiliki
O(log n)
waktu akses.Berikut langkah-langkah tentang cara menggunakan pencarian biner,
bsearch
untuk menemukan elemen atau indeksContoh kode
sumber
Anda dapat menggunakan pencarian biner (jika array Anda diurutkan dan nilai yang Anda simpan dalam array sebanding dalam beberapa hal). Agar dapat bekerja, Anda harus dapat memberi tahu pencarian biner apakah itu harus melihat "ke kiri" atau "ke kanan" dari elemen saat ini. Tapi saya percaya tidak ada yang salah dengan menyimpan
index
pada waktu penyisipan dan kemudian menggunakannya jika Anda mendapatkan elemen dari larik yang sama.sumber