- 浏览: 132371 次
- 性别:
- 来自: ...
文章分类
最新评论
一直把精力放在web应用的开发和框架学习,应用,架构的领悟等等这些几乎见不到算法存在的场景中,对算法这个‘内功’修炼一直有种没处下牙的尴尬境地。不过这不代表从此不再接触算法,一味的只去掌握JDK封装好的API库。今天使用String的indexOf(...)的时候突然想看看这个方法的实现,于是...
1.6.0.17的算法实现主要代码:
这个算法还是使用了简单匹配,首先找到第一个匹配的字符,然后在当前之后创建新的指针指向第二个字符,然后匹配剩余的。这个算法其实相当于i指针在匹配到不相等的时候回缩指针。所以时间复杂度是两串长度之积。不知是不是觉得不会有较长的字符串的匹配,所以不去优化,还是我把算法理解错了,呵呵。
既然我觉得这个算法不怎么好,对于较长字符串的匹配效率不怎么样,那就不得不看数据结构中被大加赞赏的KMP模式匹配算法了。具体的算法原理就不弄斧了,优秀的牛人们早就在网上留下了过分多的优秀讲解。我这里把我理解原理后的Java实现代码分享一下:
再有就是一个简单的test case.
算法这门功夫是一个程序员维持程序生命的根源或者说内功,虽然对我来说,练就基本功都需要很大的精力,我想我还是会在日常的工作学习中勤加练习的。
1.6.0.17的算法实现主要代码:
for (int i = sourceOffset + fromIndex; i <= max; i++) { /* Look for first character. */ if (source[i] != first) { while (++i <= max && source[i] != first); } /* Found first character, now look at the rest of v2 */ if (i <= max) { int j = i + 1; int end = j + targetCount - 1; for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++); if (j == end) { /* Found whole string. */ return i - sourceOffset; } } } return -1;
这个算法还是使用了简单匹配,首先找到第一个匹配的字符,然后在当前之后创建新的指针指向第二个字符,然后匹配剩余的。这个算法其实相当于i指针在匹配到不相等的时候回缩指针。所以时间复杂度是两串长度之积。不知是不是觉得不会有较长的字符串的匹配,所以不去优化,还是我把算法理解错了,呵呵。
既然我觉得这个算法不怎么好,对于较长字符串的匹配效率不怎么样,那就不得不看数据结构中被大加赞赏的KMP模式匹配算法了。具体的算法原理就不弄斧了,优秀的牛人们早就在网上留下了过分多的优秀讲解。我这里把我理解原理后的Java实现代码分享一下:
public class KmpTest { /**The Next() function of The KMP algorithm. * @param chars * @return */ private int[] createNext(char[] chars) { int len = chars.length; int[] nextArr = new int[len]; int i = 0, j = -1; while (i < len - 1) { if ((j == -1) || (chars[j] == chars[i])) { i++; j++; if (chars[j] != chars[i]) { nextArr[i] = j + 1; } else { nextArr[i] = nextArr[j]; } } else { j = nextArr[j] - 1; } } return nextArr; } /**The default method which can find the index of a pattern String in a specific String. * Pattern from the first character of the specific String. * @param str * @param pattern * @return */ public int kmpIndex(String str, String pattern) { return kmpIndex(str, pattern, 0); } /**Pattern from a specific postion of the specific String. * @param str * @param pattern * @param pos * @return */ public int kmpIndex(String str, String pattern, int pos) { char[] strChars = str.toCharArray(); char[] ptenChars = pattern.toCharArray(); int len = strChars.length; int[] next = createNext(ptenChars); int i = pos - 1, j = -1; while (i < len && j < next.length) { if ((j == -1) || (strChars[i] == ptenChars[j])) { i++; j++; } else { j = next[j] - 1; } } if (j > next.length - 1) { return i - next.length; } else { return -1; } } }
再有就是一个简单的test case.
import junit.framework.Assert; import junit.framework.TestCase; public class KmpTestCase extends TestCase { KmpTest kmpTest; @Override protected void setUp() throws Exception { kmpTest = new KmpTest(); } public void testKmpIndex() { Assert.assertEquals(0, kmpTest.kmpIndex("ababaababc", "ababa")); Assert.assertEquals(2, kmpTest.kmpIndex("ababaababc", "abaab")); Assert.assertEquals(6, kmpTest.kmpIndex("ababaababc", "babc")); Assert.assertEquals(-1, kmpTest.kmpIndex("ababaababc", "baabc")); Assert.assertEquals(2, kmpTest.kmpIndex("ababaababc", "abaa", 2)); Assert.assertEquals(-1, kmpTest.kmpIndex("ababaababc", "abaa", 3)); } }
算法这门功夫是一个程序员维持程序生命的根源或者说内功,虽然对我来说,练就基本功都需要很大的精力,我想我还是会在日常的工作学习中勤加练习的。
发表评论
文章已被作者锁定,不允许评论。
-
一道位操作的趣味编程题
2010-03-14 10:50 2128看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道字符串截取的编程题
2010-03-11 10:52 2324最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
一道多线程趣味热身题
2010-02-28 18:01 1965保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4992来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4602分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11644线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12976ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8238之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15456随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2855近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5470一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7568说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7741之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2493之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1919早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3601在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2768说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2604前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2715对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3125最近写关于并发的小应 ...
相关推荐
KMP算法的实现, 这程序代码是基于KMP算法来实现的,虽然很简单,但是可能也会对你有帮助的
本文将详细介绍KMP算法的C语言实现。 首先,我们需要了解KMP算法的核心思想,即通过预处理模式串,构造一个“部分匹配表”(通常称为next数组),使得在不匹配的情况下,算法能够利用已有的信息,将模式串向右移动...
相比于简单的暴力匹配方法,KMP算法避免了不必要的回溯,极大地优化了搜索过程。 在KMP算法中,关键在于构建一个“部分匹配表”或称为“next数组”。这个表记录了模式串中每个位置上的字符与前面字符构成的最长公共...
简单的kmp算法实现,代码结构十分清晰,适合初学者理解kmp算法
1. **比较Brute-Force算法和KMP算法的比较次数**:编写程序实现这两种算法,并统计它们在处理相同输入时的比较次数,从而直观地比较两者的效率差异。 2. **实现串的替换功能**:编写函数`Replace(S, start, T, V)`,...
* 算法简单、易于实现 模式匹配的KMP算法的应用领域包括: * 文本编辑程序 * 信息检索系统 * 字符串处理 * 语言翻译系统 * 等等 模式匹配的KMP算法是一种高效、可靠的串模式匹配算法,具有广泛的应用前景。本课程...
BF 算法简单易实现,但时间复杂度较高;KMP 算法效率更高,但实现起来相对复杂。因此,在选择字符串匹配算法时,需要根据实际情况进行选择。 BF 算法和 KMP 算法都是字符串匹配中常用的算法,但它们的时间复杂度和...
在C#中实现KMP算法,可以有效地处理字符串匹配问题,避免了不必要的回溯,提高了效率。下面我们将详细探讨KMP算法的基本原理、C#实现以及应用。 ### KMP算法原理 1. **部分匹配表**:KMP算法的核心是构建一个部分...
以下是一个简单的KMP算法C++实现: ```cpp #include #include std::vector<int> computePrefixFunction(const std::string& pattern) { int m = pattern.size(); std::vector<int> pi(m); for (int i = 1, j ...
以下是一个简单的C语言实现KMP算法的代码框架: ```c #include #include // 构建前缀表 void computePrefixTable(char* pattern, int prefixTable[]) { // 省略具体实现 } // KMP算法 int KMP(char* text, ...
KMP算法的关键在于next()函数的实现。next()函数存储了模式串的“部分匹配”信息。next()函数的具体实现如下:1. 当模式串的第j个字符与主串的第i个字符相等时,next[j] = next[j-1];2. 当模式串的第j个字符与主串...
2. **快速定位**:通过next数组,KMP算法能够在出现失配时快速定位到下一个可能的匹配起点,而不是简单地移动模式串。 #### 三、KMP算法的具体实现 下面详细介绍KMP算法的实现过程,包括next数组的构建和模式匹配...
KMP算法的实现主要基于部分匹配表(Partial Match Table,也称为失配表),它记录了模式串中每个字符前缀和后缀的最大公共长度。当模式串在文本串中比较时遇到不匹配的情况,算法会根据失配表来决定下一次比较时模式...
相比于简单的模式匹配算法,KMP算法能够显著提高搜索速度,尤其是在处理大规模文本数据时优势明显。本文将详细介绍KMP算法的工作原理、优势以及其实现细节。 #### 简单匹配算法 在讨论KMP算法之前,我们首先回顾...
《KMP算法及其在内核实现的深度剖析》 KMP(Knuth-Morris-Pratt)算法,是由Donald Knuth、Vaughan Pratt和James H. Morris三位学者于1970年代提出的一种字符串匹配算法。这个算法以其高效性和避免了不必要的字符...
KMP 算法的时间复杂度为 O(m+n),远远优于简单匹配算法的时间复杂度 O(m*n)。在实际应用中,KMP 算法常用于文本搜索、模式识别等领域。 模式函数值 模式函数值是 KMP 算法中非常重要的一个概念。模式函数值表示...
"kmp算法详解" KMP 字符串模式匹配算法是高效的字符串匹配算法,时间复杂度为 O(m+n),其中 m 和 n 分别是主串和模式串的长度。KMP 算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。 KMP 算法的...
KMP算法的核心在于避免了传统字符串匹配算法中出现的不必要的回溯操作,即当模式串的一部分与主串匹配失败时,能够快速确定下一步应该从模式串的哪个位置开始继续匹配,而不是简单地回退到之前的匹配位置重新开始...
以下是一个简单的C语言实现KMP算法的示例: ```c #include #include // 构建部分匹配表 void compute_Pi(char* pattern, int* pi, int m) { int i = 1, j = 0; pi[0] = 0; while (i ) { if (pattern[i] == ...