×

Cài đặt thuật toán Edit Distance trong lập trình

Trong lập trình, cài đặt thuật toán Edit Distance là một kỹ năng quan trọng cho các nhà phát triển và nhà khoa học dữ liệu. Công cụ này được thiết kế để đo lường sự khác biệt giữa hai chuỗi ký tự, đôi khi được gọi là khoảng cách Levenshtein.

Thuật toán Edit Distance có nhiều ứng dụng trong thực tại, chẳng hạn như:

  • Tìm kiếm gần đúng trong cơ sở dữ liệu văn bản
  • Khớp mẫu trong xử lý ngôn ngữ tự nhiên
  • Tự động sửa lỗi chính tả

Nguyên lý của thuật toán Edit Distance

Thuật toán này đánh giá hai chuỗi và tìm cách biến đổi một chuỗi thành chuỗi khác bằng các phép toán sau:

  • Thay thế một ký tự
  • Xóa một ký tự
  • Thêm một ký tự

Cài đặt thuật toán

Để giải thích rõ hơn, hãy xem xét cách cài đặt thuật toán Edit Distance bằng ngôn ngữ lập trình Python. Đầu tiên, chúng ta khai báo một hàm có hai tham số đầu vào là hai chuỗi cần so sánh. Chúng ta sẽ sử dụng một mảng 2D để lưu trữ kết quả của các phép biến đổi đã hoàn thành.

def edit_distance(str1, str2):
    m = len(str1)
    k = len(str2)
    
    dp = [[0 for x in range(k + 1)] for x in range(m + 1)]
    
    for i in range(m + 1):
        for j in range(k + 1):
            
            # Trường hợp đầu tiên: một trong hai chuỗi là rỗng
            if i == 0:
                dp[i][j] = j
            elif j == 0:
                dp[i][j] = i
            
            # Trường hợp các ký tự cuối trùng nhau, không thay đổi gì
            elif str1[i-1] == str2[j-1]:
                dp[i][j] = dp[i-1][j-1]
            
            # Trường hợp các ký tự cuối không trùng nhau
            else:
                dp[i][j] = 1 + min(dp[i][j-1],    # Thêm
                                   dp[i-1][j],    # Xóa
                                   dp[i-1][j-1])  # Thay thế

    return dp[m][k]

# Thử nghiệm hàm với ví dụ đơn giản
str1 = "kitten"
str2 = "sitting"

print(edit_distance(str1, str2))

Đoạn mã trên cho thấy rằng để biến chuỗi "kitten" thành "sitting", chúng ta cần thực hiện 3 phép biến đổi: thay thế 'k' bằng 's', thay thế 'e' bằng 'i', và thêm 'g' vào cuối chuỗi.

Phân tích độ phức tạp

Độ phức tạp thời gian của thuật toán là O(mk), và độ phức tạp không gian cũng là O(mk), trong đó m và k là độ dài của hai chuỗi. Điều này làm cho thuật toán này rất hiệu quả và phù hợp cho việc xử lý văn bản lớn.

Các tối ưu khác

Có một số cải tiến có thể thực hiện:

  • Không gian cải thiện: Bằng cách sử dụng mảng 1D thay vì mảng 2D
  • Điểm Heuristics: Dùng các phương pháp heuristic để giảm số so sánh cần thiết

Chúng ta có thể tối ưu không gian bằng việc sử dụng chỉ hai hàng của mảng một chiều, điều này giúp tiết kiệm bộ nhớ rất nhiều trong những ứng dụng thực tiễn với chuỗi độ dài lớn.

Kết luận

Thuật toán Edit Distance không chỉ mang lại cách tiếp cận hiệu quả để so sánh hai chuỗi mà còn có nhiều ứng dụng rộng rãi trong lĩnh vực xử lý ngôn ngữ tự nhiên và tìm kiếm văn bản. Cài đặt thuật toán này bằng Python cho thấy rõ tính linh hoạt và hiệu quả của hướng tiếp cận này.

Comments