0

我需要在乐曲(例如存储在表格中的音符音高[字符串值])中针对参考找到 1.mismatch(错误演奏的音符)、2.insertion(附加演奏)和 3.deletion(遗漏的音符)音乐片。

这可以通过精确字符串匹配算法或动态编程/近似字符串匹配算法来实现。但是我意识到,由于识别不匹配、插入、删除注释,近似字符串匹配更适合我的问题。或 Boyer-moore 的扩展版本以支持大约。字符串匹配。

是否有示例 java 代码的链接我可以尝试近似字符串匹配?我找到了复杂的解释和方程式——但我希望我能用一些示例代码和简单的解释做得很好。或者我可以在 boyer-moore 上找到任何示例 java 代码扩展约。字符串匹配?我理解 boyer-moore 的概念,但是在调整它以支持大约。字符串匹配(即支持不匹配、插入、删除)。

还有什么是最有效的。字符串匹配算法(如精确字符串匹配算法中的 boyer-moore)?

非常感谢任何见解/建议。提前谢谢了

4

2 回答 2

1

您可以从关于近似字符串匹配的 Wikipedia 页面开始。

问题是这一个复杂的领域,仅仅查看/复制一些示例代码可能无法帮助您了解正在发生的事情。

编辑- 此外,我看不到 Boyer-Moore 将如何适应近似字符串匹配。

于 2010-06-14T00:30:23.260 回答
0

这是 C# Boyer-More 代码,可以将其转换为 BMH 或近似匹配。

Dictionary<char, int> ShiftSizeTable = new Dictionary<char, int>();

        //Calculate Shifit/Skip count for each element in pattern text. So that we can skip that many no of Characters in given text while searching.
        public void PreProcessBMSBadMatchTable(char[] patternCharacters)
        {
            ShiftSizeTable.Clear();

            int totalCharacters = patternCharacters.Length;

            for (int lpIndex = 0; lpIndex < totalCharacters; lpIndex++)
            {
                //Calculate the shift size for each character in the string or char array.
                int ShiftSize = Math.Max(1, (totalCharacters - 1) - lpIndex);

                //If the charater is already exists in the ShiftSize table then replace it else add it to ShiftSize table.
                if (ShiftSizeTable.ContainsKey(patternCharacters[lpIndex]))
                {
                    ShiftSizeTable.Remove(patternCharacters[lpIndex]);
                }

                ShiftSizeTable.Add(patternCharacters[lpIndex], ShiftSize);
            }
        }

        //Use the PreProcessed Shift/Skip table to find the pattern Characters in text and skip the bad Characters in the text.
        public int BoyerMooreSearch1UsingDictionary(char[] textCharacters, char[] patternCharacters)
        {        
            PreProcessBMSBadMatchTable(patternCharacters);

            int SkipLength;
            int patternCharactersLenght = patternCharacters.Length;
            int textCharactersLenght = textCharacters.Length;

            // Step2. Use Loop through each character in source text use ShiftArrayTable to skip the elements.
            for (int lpTextIndex = 0; lpTextIndex <= (textCharactersLenght - patternCharactersLenght); lpTextIndex += SkipLength)
            {
                SkipLength = 0;

                for (int lpPatIndex = patternCharactersLenght - 1; lpPatIndex >= 0; lpPatIndex--)
                {
                    if (patternCharacters[lpPatIndex] != textCharacters[lpTextIndex + lpPatIndex])
                    {
                        SkipLength = Math.Max(1, lpPatIndex - ShiftSizeTable[patternCharacters[lpPatIndex]]);
                        break;
                    }
                }
                if (SkipLength == 0)
                {
                    return lpTextIndex;    // Found
                }
            }
            return -1; // Not found
        } 
于 2014-01-25T07:30:46.403 回答