中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#通過編輯距離計算兩個字符串的相似度的代碼

發布時間:2020-07-02 10:06:41 來源:網絡 閱讀:341 作者:dinosaur2019 欄目:編程語言

將開發過程中較好的一些代碼段備份一下,下面的代碼是關于C#通過編輯距離計算兩個字符串的相似度的代碼,應該能對碼農們有些幫助。

using System;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Levenshtein
{
    public delegate void AnalyzerCompletedHander(double sim);

    public class LevenshteinDistance:IDisposable
    {
        private string str1;
        private string str2;
        private int[,] index;
        int k;
        Task<double> task;

        public event AnalyzerCompletedHander AnalyzerCompleted;

        public string Str1
        {
            get { return str1; }
            set
            {
                str1 = Format(value);
                index = new int[str1.Length, str2.Length];
            }
        }

        public string Str2
        {
            get { return str2; }
            set
            {
                str2 = Format(value);
                index = new int[str1.Length, str2.Length];
            }
        }

        public int TotalTimes
        {
        }

        public bool IsCompleted
        {
            get { return task.IsCompleted; }
        }

        public LevenshteinDistance(string str1, string str2)
        {
            this.str1 = Format(str1);
            this.str2 = Format(str2);
            index = new int[str1.Length, str2.Length];
        }

        public LevenshteinDistance()
        {
        }

        public void Start()
        {
            task = new Task<double>(Analyzer);
            task.Start();
            task.ContinueWith(o => Completed(o.Result));
        }

        public double StartAyns()
        {
            task = new Task<double>(Analyzer);
            task.Start();
            task.Wait();
            return task.Result;
        }

        private void Completed(double s)
        {
            if (AnalyzerCompleted != null)
            {
                AnalyzerCompleted(s);
            }
        }

        private double Analyzer()
        {
            if (str1.Length == 0 || str2.Length == 0)
                return 0;
            for (int i = 0; i < str1.Length; i++)
            {
                for (int j = 0; j < str2.Length; j++)
                {
                    k = str1[i] == str2[j] ? 0 : 1;
                    if (i == 0&&j==0)
                    {
                        continue;
                    }
                    else if (i == 0)
                    {
                        index[i, j] = k + index[i, j - 1];
                        continue;
                    }
                    else if (j == 0)
                    {
                        index[i, j] = k + index[i - 1, j];
                        continue;
                    }
                    int temp = Min(index[i, j - 1],
                        index[i - 1, j], 
                        index[i - 1, j - 1]);
                    index[i, j] = temp + k;
                }
            }
            float similarty = 1 - (float)index[str1.Length - 1, str2.Length - 1] 
                / (str1.Length > str2.Length ? str1.Length : str2.Length);
            return similarty;
        }

        private string Format(string str)
        {
            str = Regex.Replace(str, @"[^a-zA-Z0-9u4e00-u9fa5s]", "");
            return str;
        }

        private int Min(int a, int b, int c)
        {
            int temp = a < b ? a : b;
            temp = temp < c ? temp : c;
            return temp;
        }

        public void Dispose()
        {
            task.Dispose();
        }
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东城区| 涞水县| 凤山县| 高要市| 北碚区| 太康县| 郎溪县| 寻甸| 公安县| 枣庄市| 屯门区| 西峡县| 运城市| 黄冈市| 罗定市| 聂拉木县| 安丘市| 昭通市| 新竹市| 隆尧县| 鹤岗市| 开原市| 临朐县| 义马市| 黑河市| 建宁县| 怀宁县| 梅河口市| 铜陵市| 临猗县| 囊谦县| 洛阳市| 福鼎市| 北川| 子洲县| 修武县| 博客| 达州市| 内丘县| 太康县| 玛沁县|