Rumah >Java >javaTutorial >Penjelasan terperinci algoritma pemadanan rentetan dilaksanakan di Java

Penjelasan terperinci algoritma pemadanan rentetan dilaksanakan di Java

王林
王林asal
2023-06-18 09:22:391829semak imbas

Algoritma pemadanan rentetan ialah masalah penting dalam sains komputer, yang boleh digunakan untuk mencari kedudukan satu rentetan dalam rentetan lain. Dalam senario aplikasi praktikal, algoritma pemadanan rentetan sering digunakan dalam enjin carian, perlombongan data, analisis jujukan biologi dan medan lain. Artikel ini akan memperkenalkan secara terperinci algoritma pemadanan rentetan yang biasa digunakan dalam Java dan meneroka kelebihan dan kekurangannya.

  1. Algoritma Brute-Force

Algoritma Brute-Force ialah algoritma yang paling mudah dan paling asas antara algoritma padanan rentetan. Ideanya adalah untuk bermula dari aksara pertama rentetan sasaran dan padankan dengan aksara pertama rentetan corak Jika perlawanan itu berjaya, teruskan padanan ke belakang aksara pertama rentetan corak. Jika perlawanan berjaya, ulangi operasi di atas sehingga semua rentetan corak berjaya dipadankan, atau semua perbandingan antara rentetan sasaran dan rentetan corak selesai.

Kerumitan masa bagi algoritma pemadanan daya kasar ialah O(m*n), dengan m dan n ialah panjang rentetan sasaran dan rentetan corak masing-masing. Algoritma pemadanan daya kasar berfungsi dengan baik apabila panjang rentetan sasaran dan rentetan corak tidak besar. Tetapi apabila panjang rentetan sasaran dan rentetan corak secara beransur-ansur meningkat, kecekapan algoritma pemadanan brute force akan menurun secara mendadak kerana ia akan membandingkan sejumlah besar aksara yang tidak diperlukan.

  1. Algoritma KMP

Algoritma KMP (Algoritma Knuth-Morris-Pratt) ialah algoritma pemadanan rentetan yang lebih cekap daripada algoritma pemadanan daya kasar. Idea asas algoritma KMP adalah untuk mengurangkan perbandingan aksara yang tidak perlu dengan bantuan aksara separa yang telah dipadankan.

Algoritma KMP terbahagi terutamanya kepada dua bahagian, prapemprosesan dan pemadanan. Dalam peringkat prapemprosesan, algoritma KMP akan membina jadual awalan dan akhiran terpanjang rentetan corak, iaitu tatasusunan seterusnya. Dalam peringkat padanan, algoritma KMP akan menggunakan tatasusunan seterusnya untuk menentukan kedudukan pergerakan rentetan corak berdasarkan awalan terpanjang bagi aksara yang dipadankan dan perbandingan akhiran kedudukan padanan rentetan corak.

Kerumitan masa algoritma KMP ialah O(m+n), dengan m dan n ialah panjang rentetan sasaran dan rentetan corak masing-masing. Berbanding dengan algoritma pemadanan brute force, algoritma KMP menggunakan prapemprosesan untuk menjadikannya berprestasi lebih baik apabila memadankan sejumlah besar teks. Walau bagaimanapun, algoritma KMP memerlukan ruang tambahan untuk menyimpan tatasusunan seterusnya, jadi kerumitan ruangnya lebih tinggi daripada algoritma pemadanan kuasa kasar.

  1. Algoritma BM

Algoritma BM (Algoritma Boyer-Moore) ialah algoritma pemadanan rentetan dengan pengiraan prapemprosesan yang kecil dan kecekapan pemadanan yang tinggi. Idea teras algoritma BM adalah untuk menentukan kedudukan rentetan corak yang digerakkan dengan mempertimbangkan aksara dalam rentetan sasaran yang sepadan dengan aksara terakhir bahagian rentetan corak yang tidak sepadan.

Algoritma BM terbahagi kepada dua peringkat iaitu peraturan watak buruk dan peraturan akhiran yang baik.

Peraturan aksara buruk bermakna jika aksara tertentu dalam rentetan sasaran tidak sepadan dengan aksara dalam rentetan corak, offset rentetan corak boleh dikira berdasarkan kedudukan di mana watak buruk itu muncul.

Peraturan akhiran yang baik bermaksud mencari imbuhan dalam rentetan pola yang sepadan dengan imbuhan yang baik. Jika tidak, cuba cari jika terdapat imbuhan lain dalam imbuhan baik yang sepadan dengannya.

Kerumitan masa bagi algoritma BM ialah O(m+n), dengan m dan n ialah panjang rentetan sasaran dan rentetan corak masing-masing. Berbanding dengan algoritma padanan KMP dan brute force, algoritma BM menunjukkan prestasi yang lebih baik dalam padanan rentetan besar, tetapi memerlukan ruang tambahan untuk menyimpan kedudukan kejadian aksara dalam rentetan corak.

  1. Algoritma Rabin-Karp

Algoritma Rabin-Karp ialah algoritma pemadanan rentetan berasaskan hash yang mengira nilai cincangan setiap subrentetan dalam masa tetap dikira dan dibandingkan dengan nilai cincang rentetan yang akan dipadankan.

Idea utama algoritma Rabin-Karp ialah menggunakan fungsi cincang untuk mengira nilai cincang setiap subrentetan dalam rentetan sasaran, dan kemudian bandingkan nilai cincang rentetan corak dengan cincangan setiap subrentetan dalam rentetan sasaran dibandingkan. Oleh kerana pemetaan fungsi cincang adalah unik, jika nilai cincang rentetan corak dan subrentetan rentetan sasaran adalah sama, maka terdapat kebarangkalian tinggi bahawa dua rentetan adalah sama.

Kerumitan masa algoritma Rabin-Karp ialah O(m+n), dengan m dan n ialah panjang rentetan sasaran dan rentetan corak masing-masing. Berbanding dengan algoritma KMP dan BM, algoritma Rabin-Karp menggunakan lebih sedikit memori, tetapi memerlukan operasi perbandingan tambahan apabila mengendalikan perlanggaran cincang.

Ringkasnya, algoritma pemadanan rentetan yang biasa digunakan dalam Java terutamanya termasuk algoritma pemadanan brute force, algoritma KMP, algoritma BM dan algoritma Rabin-Karp. Algoritma ini mempunyai kelebihan dan kelemahan tersendiri dalam pelaksanaan dan prestasi, dan algoritma yang sesuai perlu dipilih mengikut senario tertentu. Dalam aplikasi praktikal, kita boleh memilih algoritma yang paling sesuai berdasarkan faktor seperti panjang rentetan, tahap padanan, penggunaan memori, dsb.

Atas ialah kandungan terperinci Penjelasan terperinci algoritma pemadanan rentetan dilaksanakan di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn