ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

查找树-- 基于后缀字典树实现字符串的模式查找

2021-11-01 20:03:43  阅读:124  来源: 互联网

标签:SuffixTrieNode pat String -- 后缀 length 查找 txt children


模式查找问题

给定文本txt[0…N-1] 和 模式pat[0…M-1],假设是n > m。
写一个函数search(char pat[], char txt[]),打印txt[]中所有出现的pat[]

如查找一段核苷酸序列的片段在基因组中的位置

实现思路

基于后缀字典树实现字符串的模式查找
查找的时间复杂度为O(m+k),其中m为模式的长度,k为模式在文本中出现的次数

如何构建树

  • 生成给定字符串的所有后缀。
  • 把所有的后缀作为一个字符串,构建Trie

示例如下图,如构建字符串banana的后缀字典树,方式如下:
在这里插入图片描述

如何查找

  • 从模式字符串的第一个字符和Trie 的树根开始,针对每个字符 做如下操作:
    • 对于当前字符,如果从当前节点有一条边,则沿着这条边继续。
    • 如果没有边,打印“pattern doesn’t exist in text”并返回。
  • 如果模式的所有字符都被处理过,即给定模式的字符,存在一条来自根的路径,则打印模式存在的所有索引。

实现源码示例

import java.util.LinkedList;
import java.util.List;
class SuffixTreeTest{
    public static void main(String args[]) {
        String txt = "this is a beautiful world";
        SuffixTree tree = new SuffixTree(txt);

        //打印模式出现的位置
        System.out.println("Search for 'beauti'");
        tree.searchTree("beati");

        System.out.println("Search for 'is'");
        tree.searchTree("is");
    }
}

class SuffixTree{
    SuffixTrieNode root = new SuffixTrieNode();

    SuffixTree(String txt) {
        for (int i = 0; i < txt.length(); i++) {
            root.insertSuffix(txt.substring(i), i);
        }
    }
    void searchTree(String pat) {
        if(pat.length()>0) {
            List<Integer> result = root.search(pat);
            if (result == null) {
                System.out.println("Pattern not found");
            } else {
                int patLen = pat.length();
                for (Integer i : result) {
                    System.out.println("Pattern found at position " + (i - patLen));
                }
            }
        }
        System.out.println("length of Pattern must > 0 ");
    }

    private class SuffixTrieNode {
        final static int MAX_CHAR = 256;

        SuffixTrieNode[] children = new SuffixTrieNode[MAX_CHAR];
        List<Integer> indexes;

        SuffixTrieNode() {
            indexes = new LinkedList<Integer>();
            for (int i = 0; i < MAX_CHAR; i++) {
                children[i] = null;
            }
        }

        void insertSuffix(String s, int index) {
            indexes.add(index);
            if (s.length() > 0) {
                char cIndex = s.charAt(0);
                if (children[cIndex] == null) {
                    children[cIndex] = new SuffixTrieNode();
                }
                children[cIndex].insertSuffix(s.substring(1), index + 1);
            }
        }

        List<Integer> search(String s) {
            if (s.length() == 0) {
                return indexes;
            }

            if (children[s.charAt(0)] != null) {
                return (children[s.charAt(0)]).search(s.substring(1));
            } else {
                return null;
            }
        }
    }
}

标签:SuffixTrieNode,pat,String,--,后缀,length,查找,txt,children
来源: https://blog.csdn.net/penriver/article/details/121080833

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有