首頁 > 資料庫 > mysql教程 > 如何最佳化 PHP 應用程式和 MySQL 資料庫之間的 Levenshtein 距離計算?

如何最佳化 PHP 應用程式和 MySQL 資料庫之間的 Levenshtein 距離計算?

Patricia Arquette
發布: 2024-12-05 15:34:10
原創
485 人瀏覽過

How can I optimize Levenshtein distance calculations between a PHP application and a MySQL database?

MySQL 和PHP 中的Levenshtein:一種最佳化方法

在原始程式碼片段中,計算給定單字與每個單字之所以間的Levenshtein 距離使用PHP 中的levenshtein 函數從資料庫中提取術語。然而,這種方法涉及多個資料庫查詢,這對於大型資料集可能效率低下。更有效的解決方案是利用 Levenshtein 距離作為資料庫查詢本身的篩選器。

要實現此目的,您需要在 MySQL 中實作 Levenshtein 函數。例如,您可以考慮以下自訂函數:

DELIMITER $$
CREATE FUNCTION levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT
BEGIN
DECLARE len1 INT DEFAULT LENGTH(s1);
DECLARE len2 INT DEFAULT LENGTH(s2);
DECLARE i, j, cost, d INT DEFAULT 0;

DECLARE sp VARCHAR(255);

IF len1 = 0 THEN
    RETURN len2;
ELSEIF len2 = 0 THEN
    RETURN len1;
ELSE
    SET sp = REPEAT(' ', len1);
    FOR i = 1 TO len1 DO
        SET sp = CONCAT(sp, i);
    END FOR;
    SET sp = CONCAT(sp, CHAR(10));
    FOR j = 1 TO len2 DO
        SET sp = CONCAT(sp, j, CHAR(10));
        SET cost = j;
        FOR i = 1 TO len1 DO
            IF s1 SUBSTRING(i, 1) = s2 SUBSTRING(j, 1) THEN
                SET d = 0;
            ELSE
                SET d = 1;
            END IF;
            SET cost = LEAST(
                cost + 1,
                i + 1 + 1,
                j + d + 1
            );
            SET sp = CONCAT(sp, cost);
        END FOR;
    END FOR;
    SET sp = CONCAT(sp, CHAR(10));
    RETURN SUBSTRING_INDEX(sp, CHAR(10), -1) - len1 - 1;
END IF;
END$$
DELIMITER ;
登入後複製

在MySQL 中定義Levenshtein 函數後,您可以如下修改查詢:

$word = mysql_real_escape_string($word);
mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND 4");
登入後複製

此查詢將傳回單字表中與指定單字的編輯距離在0 到4 之間的所有術語。透過避免多個 PHP 循環並依賴資料庫的內建函數,您可以實現顯著的效能提升,尤其是對於大型資料集。

以上是如何最佳化 PHP 應用程式和 MySQL 資料庫之間的 Levenshtein 距離計算?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板