zoukankan      html  css  js  c++  java
  • Algorithm

    算法分析与代码实现

    LCSS

    最长公共子序列(Longest-Common-Subsequence) 

    核心代码

                for (int i = 0; i < ArrayLengthA; ++i) {
                    for (int j = 0; j < ArrayLengthB; ++j) {
                           if (SequenceA[i].equals(SequenceB[j])) {
                               Lcs[i + 1][j + 1] = Lcs[i][j] + 1;
                               Flag[i + 1][j + 1] = 1;                //1:ok 2:left 3:up
                           }else if (Lcs[i + 1][j] > Lcs[i][j + 1]) {
                               Lcs[i + 1][j + 1] = Lcs[i + 1][j];
                               Flag[i + 1][j + 1] = 2;
                           }else {
                               Lcs[i + 1][j + 1] = Lcs[i][j + 1];
                               Flag[i + 1][j + 1] = 3;
                           }
                       }
                }

    序列的回溯

            public void getLongestCommonSubsequence(int[][] Flag, String[] SequenceA, int LengthA, int LengthB) {
                if (Flag[LengthA][LengthB] == 1) {
                    getLongestCommonSubsequence(Flag, SequenceA, LengthA - 1, LengthB - 1);
                    this.LongestCommonSubsequence.add(SequenceA[LengthA - 1]);
                }else if (Flag[LengthA][LengthB] == 2) {
                    getLongestCommonSubsequence(Flag, SequenceA, LengthA, LengthB - 1);
                }else if (Flag[LengthA][LengthB] == 3) {
                    getLongestCommonSubsequence(Flag, SequenceA, LengthA - 1, LengthB);
                }
            }

    算法过程分析

    DTW

    动态时间规划(Dynamic Time Warping)求解两序列最小距离

    核心代码

                for (int i = 0; i < LengthA; ++i) {
                    for (int j = 0; j < LengthB; ++j) {
                        if (i == 0 && j == 0) {
                            this.SumDistance[i][j] = this.Distance[0][0];
                            DistanceTmp1 = 0.0;
                            DistanceTmp2 = 0.0;
                            DistanceTmp3 = 0.0;
                        }
                        if (i == 0 && j > 0) {
                            DistanceTmp1 = 1000000.0;
                            DistanceTmp2 = this.SumDistance[i][j - 1];
                            DistanceTmp3 = 1000000.0;
                        }
                        if (i > 0 && j == 0) {
                            DistanceTmp1 = this.SumDistance[i - 1][j];
                            DistanceTmp2 = 1000000.0;
                            DistanceTmp3 = 1000000.0;
                        }
                        if (i > 0 && j > 0) {
                            DistanceTmp1 = this.SumDistance[i - 1][j];
                            DistanceTmp2 = this.SumDistance[i][j - 1];
                            DistanceTmp3 = this.SumDistance[i - 1][j - 1];
                        }
                        this.SumDistance[i][j] = this.Distance[i][j] + Math.min(DistanceTmp1, Math.min(DistanceTmp2, DistanceTmp3));
                    }
                }

    算法原理 

    算法过程分析

    长串中寻找最长重复子串

    不断将子串的串长增长,并向后移动起始位置进行匹配

    核心代码

                for (int i = 1; i < OriginalString.length; ++i) {
                    for (int j = 0; j < OriginalString.length - i; ++j) {
                        if (OriginalString[j].equals(OriginalString[i + j])) {
                            TempLength++;
                        } else {
                            TempLength = 0;
                        }
                        if (TempLength > MaxLength) {
                            MaxLength = TempLength;
                            First = j - TempLength + 1;
                        }
                        if ((i + j + 1) == OriginalString.length) {
                            TempLength = 0;
                        }
                    }
                }

     算法过程分析

    KMP

    匹配模式主串,时间复杂度O(m+n)

    核心代码

            //next数组的构建        
    public
    void getNext(String[] StringP) { this.Next = new int[StringP.length]; this.Next[0] = -1; int PointerJ = 0; int PointerK = -1; while (PointerJ < StringP.length - 1) { if (PointerK == -1 || StringP[PointerJ] == StringP[PointerK]) { if (StringP[++PointerJ] == StringP[++PointerK]) { // 当两个字符相等时要跳过 this.Next[PointerJ] = this.Next[PointerK]; } else { this.Next[PointerJ] = PointerK; } } else { PointerK = this.Next[PointerK]; } } }
                //模式匹配
    while
    (PointerI < StringT.length && PointerJ < StringP.length) { if (PointerJ == -1 || StringT[PointerI] == StringP[PointerJ]) { // 当j为-1时,要移动的是i,当然j也要归0 PointerI++; PointerJ++; } else { PointerJ = this.Next[PointerJ]; } } if (PointerJ == StringP.length) { return PointerI - PointerJ; } else { return -1; }

    算法原理以及过程分析


     完整代码:https://github.com/xinglicha0/algorithm

  • 相关阅读:
    debug:am dumpheap命令源码分析
    Android12系统源码分析:NativeTombstoneManager
    性能工具|ANRdaemon
    exampleappcoldstartbinder.trace
    debug:am profile命令的实现
    android studio的巨坑笔记
    android studio获取签名哈希
    Nginx配置反向代理 proxy_pass King
    Nginx配置反向代理 rewrite King
    Nginx配置文件nginx.conf详解 King
  • 原文地址:https://www.cnblogs.com/xinglichao/p/9842006.html
Copyright © 2011-2022 走看看