Algoritma Aho-Corasick


Algoritma Aho-Corasick adalah salah satu algoritma yang dapat digunakan untuk mencari dimana sebuah string (dalam kasus ini dinamakan sebagai pola) apakah ditemukan di dalam kumpulan string lain dengan ukuran yang lebih besar. Contoh yang dibahas kali ini adalah mengenai pencarian kata dari sebuah input teks.
Aho-Corasick adalah algoritma berbasis kamus yang mencari beberapa set pola pada data input. Pencocokan juga dilakukan secara bersamaan, sehingga kejadian pencocokan dapat ditemukan selama beberapa kali untuk setiap substring yang terdapat dalam data input. Secara informal, algoritma ini melakukan penyusunan FSM (Finite State Machine) yang menyerupai pohon dengan beberapa link diantara node internalnya. Link internal ini memungkinkan perpindahan secara cepat diantara string yang tidak cocok pada cabang lain yang memliki prefiks yang sama. Hal ini menyebabkan sistem dapat berpindah secara cepat tanpa perlu melakukan backtracking / penelusuran ulang.


Langkah-langkah penggunaan algoritma ini adalah

1. Tentukan teks yang digunakan sebagai input
Diasumsikan data input adalah sebagai berikut:
internationalization

2. Tentukan kata kunci yang digunakan dalam pencarian
Diasumsikan pola adalah sebagai berikut
on
tion
int
na

3. Lakukan pencarian kata kunci menggunakan algoritma ini

Dim daftarState As List(Of Integer) = HitungSemuaState(input, kataKunci)

* Gunakan fungsi ini untuk menghitung semua state pada data input

Public Function HitungSemuaState(input As String, kataKunci As String(), Optional limitBawahKarakter As Char = "a"c, Optional limitAtasKarakter As Char = "z"c) As List(Of Integer)
	rancangSistem(kataKunci, limitBawahKarakter, limitAtasKarakter)

	Dim stateSekarang As Integer = 0
	Dim hasil As New List(Of Integer)()

	For i As Integer = 0 To input.Length - 1
		stateSekarang = HitungStateSelanjutnya(stateSekarang, input(i), limitBawahKarakter)

		If Out(stateSekarang) = 0 Then
			Continue For
		End If

		For j As Integer = 0 To kataKunci.Length - 1
			If Convert.ToBoolean(Out(stateSekarang) And (1 << j)) Then
				hasil.Insert(0, i - kataKunci(j).Length + 1)
			End If
		Next
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk merancang sistem pencarian data

Private Function rancangSistem(daftarKata As String(), Optional limitBawahKarakter As Char = "a"c, Optional limitAtasKarakter As Char = "z"c) As Integer
	Out = Enumerable.Repeat(0, Out.Length).ToArray()
	FF = Enumerable.Repeat(-1, FF.Length).ToArray()

	For i As Integer = 0 To maksState - 1
		For j As Integer = 0 To maksKarakter - 1
			GF(i, j) = -1
		Next
	Next

	Dim states As Integer = 1

	For i As Integer = 0 To daftarKata.Length - 1
		Dim kataKunci As String = daftarKata(i)
		Dim stateSekarang As Integer = 0

		For j As Integer = 0 To kataKunci.Length - 1
			Dim c As Integer = Convert.ToInt32(kataKunci(j)) - Convert.ToInt32(limitBawahKarakter)

			If GF(stateSekarang, c) = -1 Then
				GF(stateSekarang, c) = System.Math.Max(System.Threading.Interlocked.Increment(states), states - 1)
			End If

			stateSekarang = GF(stateSekarang, c)
		Next

		Out(stateSekarang) = Out(stateSekarang) Or (1 << i)
	Next

	For c As Integer = 0 To maksKarakter - 1
		If GF(0, c) = -1 Then
			GF(0, c) = 0
		End If
	Next

	Dim q As New List(Of Integer)()
	For c As Integer = 0 To Convert.ToInt32(limitAtasKarakter) - Convert.ToInt32(limitBawahKarakter)
		If GF(0, c) <> -1 AndAlso GF(0, c) <> 0 Then
			FF(GF(0, c)) = 0
			q.Add(GF(0, c))
		End If
	Next

	While Convert.ToBoolean(q.Count)
		Dim state As Integer = q(0)
		q.RemoveAt(0)

		For c As Integer = 0 To Convert.ToInt32(limitAtasKarakter) - Convert.ToInt32(limitBawahKarakter)
			If GF(state, c) <> -1 Then
				Dim failure As Integer = FF(state)

				While GF(failure, c) = -1
					failure = FF(failure)
				End While

				failure = GF(failure, c)
				FF(GF(state, c)) = failure
				Out(GF(state, c)) = Out(GF(state, c)) Or Out(failure)
				q.Add(GF(state, c))
			End If
		Next
	End While

	Return states
End Function


Hasil akhir adalah: (klik untuk perbesar gambar)

cmd140


Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *