Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >贪婪的LCS Java代码实现

贪婪的LCS Java代码实现
EN

Stack Overflow用户
提问于 2014-05-31 21:11:31
回答 1查看 518关注 0票数 0

我试图从这个日志中编写java代码:

期刊贪婪LCS

此代码是一种贪婪的方法,用于计算非洲裔longest的最长公共子序列。

下面是我的编辑的代码:

代码语言:javascript
运行
AI代码解释
复制
public class LCS_Greedy {

public static void main(String[] args) {
//        String X_awal = "ABCBDABE";
//        String Y = "BDCABA";

//        String X_awal = "XMJYAUZ";
//        String Y = "MZJAWXU";
    
//        String X_awal ="AGGTAB";
//        String Y="GXTXAYB";
    
//        String X_awal = "ABCDGH";
//        String Y = "AEDFHR";
    
//        String X_awal = "AHBCDG";
//        String Y = "AEDFHR";       
    
    //greedy not always optimum
    String X_awal = "bcaaaade";
    String Y = "deaaaabc";
    String X = match(X_awal, Y);
    int[] Penanda_Y = new int[Y.length()];
    int y_length = Y.length();
    for (int k = 0; k < y_length; k++) {
        Penanda_Y[k] = 0;
    }
    int m = X.length();
    int n = Y.length();
    String L = "";
    String LSym = "";
    int R = 0;
    int i = 1;
    int[] P = new int[100];
    P[i] = posisi(X, Y, i, Penanda_Y, R);
    i = 1;
    while (i <= m) {
        if (i != m) {
            P[i + 1] = posisi(X, Y, (i + 1), Penanda_Y, R);
        }
        if (P[i + 1] == 0) {
            if (P[i] > R) {
                L = L + " " + Integer.toString(P[i]);
                LSym = LSym + " " + X.charAt(i - 1);
            }
            break;
        }

        if (P[i + 1] < R || P[i] < R) {
            R = 0;
        }
        if (P[i] > P[i + 1]) {
            if (R == 0 && i > 1) {
                L = L + " " + Integer.toString(P[i]);
                LSym = LSym + " " + X.charAt(i - 1);
                Penanda_Y[P[i] - 1] = 1;
                R = P[i];
                i = i + 1;
                if (R == Y.length() || i > X.length()) {
                    break;
                }
                P[i] = posisi(X, Y, i, Penanda_Y, R);
            } else {
                L = L + " " + Integer.toString(P[i + 1]);
                LSym = LSym + " " + X.charAt(i + 1 - 1);
                Penanda_Y[P[i + 1] - 1] = 1;
                R = P[i + 1];
                i = (i + 1) + 1;
                if (R == Y.length() || i > X.length()) {
                    break;
                }
                P[i] = posisi(X, Y, i, Penanda_Y, R);
            }

        } else {

            if (R == 0 && i > 1) {
                L = L + " " + Integer.toString(P[i + 1]);
                LSym = LSym + " " + X.charAt(i + 1 - 1);
                Penanda_Y[P[i + 1] - 1] = 1;
                R = P[i + 1];
                i = (i + 1) + 1;
                if (R == Y.length() || i > X.length()) {
                    break;
                }
                P[i] = posisi(X, Y, i, Penanda_Y, R);
            } else {
                L = L + " " + Integer.toString(P[i]);
                LSym = LSym + " " + X.charAt(i - 1);
                Penanda_Y[P[i] - 1] = 1;
                R = P[i];
                i = i + 1;
                if (R == Y.length() || i > X.length()) {
                    break;
                }
                P[i] = posisi(X, Y, i, Penanda_Y, R);
            }
        }
    }
    System.out.println("X = " + X_awal);
    System.out.println("X = " + Y);
    System.out.println("L = " + L);
    System.out.println("LSym = " + LSym);
    System.out.println("Length = " + LSym.length() / 2);
}

public static String match(String X, String Y) {
    String hasil = "";
    for (int i = 0; i < X.length(); i++) {
        for (int j = 0; j < Y.length(); j++) {
            if (X.charAt(i) == Y.charAt(j)) {
                hasil = hasil + X.charAt(i);
                break;
            }
        }
    }
    return hasil;
}

public static int posisi(String X, String Y, int i, int[] Penanda_Y, int R) {
    int n = Y.length();
    int k;
    int kr = 0;
    i = i - 1;
    for (k = 0; k < n; k++) {
        if ((X.charAt(i) == Y.charAt(k)) && Penanda_Y[k] == 0) {
            kr = k + 1;
            break;
        }
    }
    for (k = R; k < n; k++) {
        if ((X.charAt(i) == Y.charAt(k)) && Penanda_Y[k] == 0) {
            kr = k + 1;
            break;
        }
    }
    return kr;
}
}

但是当我运行那个程序时,在某些情况下它有真正的输出,但在另一个情况下它是假的。那密码怎么了?有人能跟我解释一下吗?谢谢

编辑:

我的代码现在可以完美地运行,但它似乎远离了日志中的伪代码。有人能解释一下吗?为什么我不能准确地从日志中生成代码?当我从日记中给出的伪代码生成时,总是会出错。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-05-06 06:22:17

该算法不会导致LCS。贪婪的猜测是错误的。它假设早期的比赛将保证形成LCS。尽管伪码采用了X中前两个子串的早期匹配,这可能会在Y开头跳过许多常见的子字符串。另一个简单的测试是将X中的最后一个'E‘改为'A’,该算法将无法确定地找到最后匹配的'A‘。事实是,早期的比赛可能会锁定位置,以禁止更长的比赛。换句话说,我们可能需要跳过一些早期的匹配,以便我们可以找到一个更长的匹配。从数学上证明了动态规划方法的正确性,但该算法没有实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23976954

复制
相关文章
PHP实现的贪婪算法实例
本文实例讲述了PHP实现的贪婪算法。分享给大家供大家参考,具体如下: 背景介绍:贪婪算法与数据结构知识库算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人都没学过该怎么找零钱,但在所有面额的钱都充足时,每个人都会找出同样组合来凑够需要的钱。其实这里面就是贪婪算法在起作用。 设计思路:贪婪法的设计思路可以从两方面来理解,即直观上和数学上。从直观上理解贪婪算法就是用最快的方法来解决问题。在这里面“快”是主要目标,例如上面找零钱的例子,假如你要找的零钱为6.6元。那首先要拿一张5元的,因为这可以使你凑的钱增长最快。如果人民币有6元的面额那你肯定会选6元的而不是拿两张别的来凑6元;从数学上来理解贪婪算法就是在做判断时以当前最优解为目标,类似于最优化中的最速下降法。这种方法的好处是解题速度极快,基本上是一次历遍就可以完成。 算法缺陷:正如做人不能太贪婪一样,贪婪算法本身有着致命的缺陷,这使得其应用背景收到了很多限制。因为算法是取的局部最优解,没有考虑以后的问题。这就像一个自私自利的人一样,虽然短时间内可以获得一些利益,但长期以往,很难会有大的成就。当然,社会很复杂,也许会有人一直自私下去而生活的还不错。这体现在算法上就是在一些情况下(具体下面会提到),贪婪算法是可以得到最优解的,这对于算法设计来说当然是好事。
用户2323866
2021/07/12
4240
动态规划最长公共子序列(LCS)问题(Java实现)
动态规划最长公共子序列(LCS)问题(Java实现) 首先,明白一个公共子序列和公共子串的区别 公共子序列: 可以不连续 公共子串: 必须连续 问题分析 --- 求最长公共子序列,先明白两个概念 子序列 - 一个给定序列中删去若干元素后得到的序列 公共子序列 - 给定两个序列X,Y,当另一序列Z 既是X 的子序列,又是Y 的子序列时,就称Z 为X、Y 的公共子序列 明白上述两个概念后,我们就可以开始搜索最长公共子序列 这个问题可以使用暴力方法解决,但是由于要全部搜索一遍,时间复杂度为 O(n2<su
ruochen
2021/05/14
1.4K0
动态规划最长公共子序列(LCS)问题(Java实现)
python 贪婪匹配 非贪婪匹配
贪婪匹配 str_pat = re.compile(r'"(.*)"') text1 = 'Computer says "no."' str_pat.findall(text1) ['no.'
用户5760343
2019/09/25
1.9K0
说说Python中贪婪和非贪婪匹配?
小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
程序员小猿
2021/01/19
1.8K0
LCS + Problem
最长公共子序列,。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
AngelNH
2020/04/16
5400
python实现贪婪算法解决01背包问题
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。
步履不停凡
2019/09/11
2.1K0
盘点Python正则表达式中的贪婪模式和非贪婪模式
前几天在Python最强王者交流群有个叫【杰】的粉丝问了一个关于Python正则表达式的问题,其中涉及到Python正则表达式中的贪婪模式和非贪婪模式,讨论十分火热,这里拿出来给大家分享下,一起学习。
前端皮皮
2022/08/17
8970
盘点Python正则表达式中的贪婪模式和非贪婪模式
正则表达式的贪婪和非贪婪模式
如果是贪婪模式,上面使用模式p匹配字符串str,结果就是匹配到:abcaxc,匹配到了所有的字符串。
bisal
2021/10/13
2.3K0
LCS、LIS、LICS算法
给定两个序列 ,设 为 的长度,其中 分别表示 从首元素到第 i 个元素的一段、 从首元素到第 个元素的一段, 分别表示 中第 i个元素、 中第 个元素,序列 和 的长度分别为 和 。则 的状态转移方程为:
hotarugali
2022/03/01
8470
算法学习笔记——贪婪
,贪心算法不是对全部问题都能得到总体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响曾经的状态,仅仅与当前状态有关。
全栈程序员站长
2022/07/06
2450
贪婪算法回顾
贪婪算法回顾 回顾 还记的贪婪算法么? 如果你不记得了, 看了下面这个例子你一定会想起来, 因为这个例子太普遍了, 几乎每个将贪婪算法的地方, 第一个例子都是它, 言归正传. 问题: 现在有如下课程表
烟草的香味
2019/07/25
4080
动态规划-LCS、LIS
LCS(Longest Common Subsequence)最长公共子序列。给定两个序列a和b,当另一序列c即是a的子序列又是b的子序列时,称c时a和b的公共子序列,最长公共子序列时所有子序列中长度最长的。 注意子序列是在原序列中删去若干元素后得到的序列,注意子序列≠子串,子串在原序列中是连续的。
唔仄lo咚锵
2020/09/15
5630
HDU1159(LCS)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; char
Enterprise_
2019/02/21
3680
实现随机生成汉字的Java代码
GB2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。GB2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆 99.75% 的使用频率。对于人名、古汉语等方面出现的罕用字,GB2312 不能处理,这导致了后来 GBK 及 GB18030 汉字字符集的出现。
用户1503405
2021/09/22
1.4K0
实现随机生成汉字的Java代码
一、背景知识 GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,由中国国家标准总局发布,1981年5月1日实施。GB2312 编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312。
用户8671053
2021/09/22
1.3K0
BASIC认证的JAVA实现代码
1、Http是无状态的,同一个客户端对同一个realm内资源的每一个访问会被要求进行认证。 2、客户端通常会缓存用户名和密码,并和authentication realm一起保存,所以,一般不需要你重新输入用户名和密码。 3、以非加密的明文方式传输,虽然转换成了不易被人直接识别的字符串,但是无法防止用户名密码被恶意盗用。虽然用肉眼看不出来,但用程序很容易解密。
用户7718188
2021/10/08
1.3K0
Java时间操作代码实现
OK,本文的主题是java中常用的时间操作,在平时开发过程中经常会使用到这些时间操作类,但是大部分使用都是其他工具包提供的类或者就那么几个常用的方法,对其中的方法也都并没有深入学习。所以这篇博客就记录一下我对jdk8中有关常用的时间操作的学习,在此过程中会用到jdk文档。
beifengtz
2019/06/03
6490
Java实现hello world代码
public static void main(String[ ] args) {
全栈程序员站长
2022/09/02
1840
全网最易懂的正则表达式教程(8 )- 贪婪模式和非贪婪模式
https://www.cnblogs.com/poloyy/category/1796055.html
小菠萝测试笔记
2020/07/13
8K0
全网最易懂的正则表达式教程(8 )- 贪婪模式和非贪婪模式
java代码实现FTP协议
前几节我们完成了ftp协议的主要讲解,同时使用wireshark抓包了解ftp数据协议包的特征,本节我们使用代码完成ftp协议,代码将模仿ftp客户端,它与服务器建立连接后,使用用户名和密码登陆服务器,然后获得服务器的当前目录内容,继而通过数据连接获取服务器推送目录具体信息,最后客户端关闭,下面我们看看具体的代码实现,首先在工程目录下新建名为FTPClient的类,相关实现如下:
望月从良
2020/03/17
1.2K0
java代码实现FTP协议

相似问题

贪婪算法实现

12

贪婪算法实现

23

python2中的LCS实现

12

贪婪算法实现

12

在C++中实现LCS / SES的建议

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档