经典算法回顾2

public class Main1 {
    static String s1 = "abcd";
    static String s2 = "abce";
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * 字符串相似度
         * 概念:
         * 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,
         * 在改变的过程中使用的最小步骤称之为“编辑距离”
         */
        System.out.println(LD());
    }
    public static int LD(){
        int a[][] = new int[s1.length()+1][s2.length()+1];
        for(int i = 0; i <= s1.length(); i++){
            a[i][0] = i;
        }
        for(int j = 0; j <= s2.length(); j++){
            a[0][j] = j;
        }
        for(int i = 1; i <= s1.length(); i++){
            for(int j = 1; j <= s2.length(); j++){
                if(s1.getBytes()[i-1] == s2.getBytes()[j-1]){
                    a[i][j] = a[i-1][j-1];
                }
                else{
                    int temp = Math.min(a[i-1][j], a[i][j-1]);
                    a[i][j] = Math.min(temp, a[i-1][j-1]) + 1;
                }
            }
        }
        return a[s1.length()][s2.length()];
    }
}
public class Main2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * KMP算法
         */
        String str1 = "ababcabababdc";
        String str2 = "abc";
        System.out.println("fff");
        int index = KMP(str1,str2);
        System.out.println(index);
    }
    static int KMP(String str1, String str2){
        int i = 0;
        int j = 0;
        int[] next = new int[str2.length()];
        next = GetNextVal(str2);
        while(i < str1.length() && j < str2.length()){
            if(j == -1 || str1.getBytes()[i] == str2.getBytes()[j]){
                i++;
                j++;
            }
            else{
                j = next[j];
            }
        }
        if(j == str2.length()){
            return i - str2.length();
        }
        return -1;
    }
    static int[] GetNextVal(String str2){
        int k= -1;
        int j = 0;
        int[] next = new int[str2.length()];
        next[j] = -1;
        while(j < str2.length() -1){
            if(k == -1 || str2.getBytes()[k] == str2.getBytes()[j]){
                next[++j] = ++k;
            }
            else{
                k = next[k];
            }
        }
        return next;
    }
}
时间: 2024-08-23 23:43:25

经典算法回顾2的相关文章

经典算法回顾1

本文根据园主一线码农的进程来学习,今后也会自己补充一些,希望能够有所进步public class Main { public static void main(String[] args) { // TODO Auto-generated method stub /* * 公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱 * 用100文钱买100只鸡,其中公鸡,母鸡,小鸡必须有,请问各多少只 */ for(int i = 1; i < 20;i++){ for(int j =1; j < 33;

经典算法-回顾(前十)

关于 曾经的48种经典算法与23种常用设计模式相信都不陌生了,不过好久没看了而且当时看的时候也没有整理出来,现在就慢慢整理出来(后续会慢慢更新,这里只是对经典算法进行整理): 目录: 1.河内之塔_TowersOfHanoi2.费氏数列_Fibonacci3.巴斯卡三角形4.三色棋5.老鼠走迷官16.老鼠走迷官27.骑士走棋盘_KnightTour8.八皇后9.八枚银币10.生命游戏 先来看看基本说明和解法: 1.河内之塔_TowersOfHanoi 说明 河内之塔(Towers of Hano

经典算法回顾(PHP)

排序 冒泡排序: 1 function BubbleSort($arr){ 2 for($i=0;$i<count($arr);$i++){ 3 for($j=$i+1;$j<count($arr);$j++){ 4 if($arr[$i]<$arr[$j]){ 5 $temp=$arr[$i]; 6 $arr[$i]=$arr[$j]; 7 $arr[$j]=$temp; 8 } 9 } 10 } 11 return $arr; 12 } 快速排序: $arr=[3,5,1,3,7,8

经典算法回顾

一.quicksort 1 int partition(int s[], int l, int r) 2 { 3 int i = l, j = r; 4 int x = s[l]; 5 while (i < j) 6 { 7 while (s[j] >= x&&i < j) 8 j--; 9 if (i < j) 10 { 11 s[i] = s[j]; 12 i++; 13 } 14 while (s[i] <= x&&i < j) 1

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

动态展示十大经典算法

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1.从数列中挑出一个元素,称为“基准”(pivot),

数据挖掘领域十大经典算法初探

译者:July   二零一一年一月十五日 ----------------------------------------- 参考文献:国际权威的学术组织ICDM,于06年12月年评选出的数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.==============博主说明:1.原文献非最新文章,只是本人向来对算法比较敏感.感兴趣,便把原文细看了下,翻译过程中

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序.这种方法,也被称为窄增量排序,因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97