最长平台问题描述如下:
一个从小到大排列的数组,这个数组中的一个平台就是连续的一段值相同的元素。例如:122333445中22,333等都是平台,333为最长平台。
一般常见的算法是一个计算机科学家首先给出的。
private static int f1(int[] array) {
if (array == null || array.length == 0)
return 0;
int length = 1;
for (int i = 1; i < array.length; i++) {
if (array[i] == array[i - length])
length++;
}
return length;
}
这段代码的确是简洁优雅的,但是在效率上不是很好。
最长平台有一些特点可以利用,从而使得算法的效率更高。
一个分界点元素指该元素和它的前一个元素不相等。
1 从一个分界点开始剩下的元素个数<=length,则可以直接返回。
2 从一个分界点开始找最大平台,没有必要依次顺序查找,直接跳到该(分界点的坐标+length)的元素进行查找。
如果(分界点的坐标+length)也是一个分界点,则从原来的分界点到新的分界点(分界点的坐标+length)之间的 元素可以丢掉,从新的分界点重新开始查找最长平台。
如果(分界点的坐标+length)不是一个分界点,则它有可能在一个最长平台中,判断之,然后继续。
这里主要是考虑到当前最长平台的长度,算法考虑该长度可以跳过一些元素进行处理。
/**
* 最长平台更快的算法
*/
private static int f2(int[] array) {
if (array == null || array.length == 0)
return 0;
// 下一个要检测的位置,保证array[next]!=array[next-1]。
int next = 1;
for (; next < array.length && array[next] == array[0]; next++)
;
// 第一个平台的长度,next>=1。
int length = next;
while (next < array.length) {
// 如果剩下的元素个数<=length,则不可能有最长平台了
if (array.length - next <= length) {
break;
}
// 向前跳跃length+1,到next+length处进行检查,如果array[next+length]!=array[next+length-1],则
// next - (next+length-1)这段数据可以丢弃.
if (array[next + length] != array[next + length - 1]) {
next = next + length;
} else {
// 这个相等的值所在的平台的值.
int value = array[next + length];
// 这个相等的值所在的平台的最后一个坐标.
int endIndex = next + length + 1;
for (; endIndex < array.length && array[endIndex] == value; endIndex++)
;
endIndex = endIndex - 1;
// 向后跳跃length+1,如果相等,则这个平台是最大平台.
if (array[endIndex - length] == value) {
int startIndex = endIndex - length - 1;
for (; array[startIndex] == value; startIndex--)
;
// 更新最大平台的值
length = endIndex - startIndex;
}
next = endIndex + 1;
}
}
return length;
}
code是比上一个复杂一些,但是速度有了很大的提高,大约提高60%以上。
还有改进的余地,如果在查找一个平台的最后一个坐标或者第一个坐标,可以用2分查找。
分享到:
相关推荐
最长递增序列 算法程序 最长递增序列 算法程序
最长公共字串算法,为算法导论上的算法,可以运行,运行时间为O(mn)
最长公共子序列的两种算法简介,一种是平时最常见的算法,还有一种用滚动数组来做的。
基于二级Hash的快速最长匹配分词算法,殷鹏程,谭献海,中文分词是中文信息处理的基础,在海量的中文信息处理中,分词速度至关重要。本文根据中文单词的特点,通过分析现有词典分词算法
fasta算法,Smith-waterman算法,编辑距离算法,最长公共子串算法
最长公共子串的快速搜索算法 最长公共子串的快速搜索算法 最长公共子串的快速搜索算法
用C++实现的最长公共子序列算法,并包含大量的注释,对理解程序很有帮助
算法导论实验:动态规划实现最长公共子序列问题,python实现; KR算法c语言实现。 附实验报告以及相关KMP算法的调研。
实现了求最长公共子序列的算法,内容简单易懂,代码也很短
java 最长模式匹配算法 高效比较两段字符间的差别 有使用说明
C语言写的查找输入的最长的单词,无论单词多长都能查找成功,最长的单词有多个也都能输出
算法设计与分析中的一个算法函数,用C编的
这是一个有关算法的压缩包,里面包含二分算法、合并排序、最长公共子序列、最优装载、活动安排算法
java算法分析与设计之最长公共子序列问题源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的...
最长公共子序列,动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法
最长公共子序列问题,用C#实现的动态规划算法 X=ABCBDAB Y=BDCABA 以上是示例用的测试数据,输入数据可以得到结果
中科大软件学院 算法导论课程实验 正式题目二 最长递增子序列 Visual Studio 2012 项目包 使用4种不同的方法实现最长递增子序列
最长公共子序列问题 for ( i = 0; i ; i++) { c[i] = new int[n+1]; } for(i=0;i;i++) {c[i][0]=0;b[i][0]=0;} for(i=0;i;i++) {c[0][i]=0;b[0][i]=0;} for(i=1;i;i++) for(j=1;j;j++) if(s1[i-1]==s2[j...
查找一个字符串中的最长回文子串,这里采用的是Manacher算法 比如:cababcaac的最长回文子串就是caac 其中的aba bab也都是回文子串 (Manacher算法) 效率很高的一种查找算法,效率可以达到O(2n+1)
算法与数据结构实验报告