`

Trie and suffix array

阅读更多

字典数Trie和后缀数组suffix array是处理字符串操作的有力工具。

下面是ruby的实现:

 

class Trie
	attr_accessor :value

	def initialize
		@children = Hash.new {|h,k| h[k] = Trie.new }
	end
	
	def []=(key,value)
		insert(key,0,value)
		key
	end

	def [](key)
		get(key,0)
	end

	def each &block
		_each &block
	end

	def keys
		inject([]){|keys,(k,v)| keys << k; keys}
	end

	def values
		inject([]){|values,(k,v)| values << v; values}
	end

	def each_key &block
		keys.each &block
	end

	def each_value &block
		values.each &block
	end
	
	def inspect(indent = 0)
		buffer = ''
		indent_str = ' ' * indent
		buffer << indent_str + "value: #{value}\n" if value
		return buffer unless @children.size > 0
		@children.each do |k,c|
			buffer << "#{indent_str}#{k} =>\n"
			buffer << c.inspect(indent + 2)
		end
		buffer
	end

	protected
		def _each(key='',&block)
			block.call(key,value) if key != '' and value
			@children.keys.sort.each do |k|
				@children[k]._each(key + k, &block)
			end
		end
		
		def insert(key,offset,value)
			if offset == key.length - 1
				@children[key[offset,1]].value = value
			else
				@children[key[offset,1]].insert(key,offset+1,value)
			end
		end

		def get(key,offset)
			if offset == key.length - 1
				@children[key[offset,1]].value
			else
				return nil unless @children.hash_key?(key[offset,1])
				@children[key[offset,1]].get(key,offset + 1)
			end
		end
end

t = Trie.new
t['cat'] = true
t['cab'] = true
t['cate'] = true
t['bob'] = true

p t

 suffix array,我们使用简单的排序方法,算法复杂度取决于排序的复杂度。使用快排,平均复杂度可以达到O(N*logN),最坏复杂度为O(N*N)。没有使用更高效O(N*logN)的倍增法等构建。

 

class SuffixArray
	def initialize(str)
		@str = str
		@suffix_array = Array.new

		last_index = str.length - 1
		(0..last_index).each do |i|
			suffix = str[i..last_index]
			position = i
			@suffix_array << { :suffix => suffix, :position => position }
		end
		@suffix_array.sort! {|a,b| a[:suffix] <=> b[:suffix] }
	end

	def find_substr(substr)
		high = @suffix_array.length - 1
		low = 0
		pos = -1
		while( low <= high )
			mid = (high + low ) / 2
			suffix = @suffix_array[mid][:suffix]
			pre_suffix = suffix[0...substr.length]
			if(pre_suffix > substr)
				high = mid - 1
			elsif(pre_suffix < substr)
				low = mid + 1
			else
			    return @suffix_array[mid][:position]
			end 
		end
		return -1
	end
end

sa = SuffixArray.new("The type of query that benefits most from caching")
puts sa.find_substr("query that")
分享到:
评论

相关推荐

    SuffixArray 扩展(以单词为单位) 源码

    SuffixArray是一种高效的数据结构,主要用于字符串的搜索和处理。它以一种有序的方式存储了一个字符串的所有后缀,使得在大量文本中进行模式匹配、查找、排序等操作变得非常快速。在这个扩展版本中,我们以单词为...

    字符串匹配_kmp_extend-kmp_trie_suffix-array

    在给定的标题和描述中,提到了几种不同的字符串匹配方法:KMP算法、AC自动机与Trie树以及后缀数组。接下来,我们将详细讨论这些算法。 1. **KMP算法**: KMP(Knuth-Morris-Pratt)算法是一种高效的单串匹配算法,...

    KMP算法与trie搜索树实现

    同时,这也可以作为一个起点,去探索更高级的主题,如Boyer-Moore算法、Aho-Corasick算法,或是更复杂的字符串数据结构,如suffix tree和suffix array。这些都是计算机科学领域不可或缺的知识,对于从事软件开发、...

    数据结构Advanced-Data-Structures

    Compressed suffix array 367 FM-index 368 Generalised suffix tree 371 B-trie 372 Judy array 372 Directed acyclic word graph 374 Multiway trees 376 Ternary search tree 376 And–or tree 379 (a,b)-tree ...

    SuffixTree后缀树讲义

    例如,在某些后缀树的实现中,可能会用到稀疏后缀树(sparse suffix tree)或者后缀数组(suffix array)和后缀链接(suffix link)的组合,这样可以在处理非常大的数据集时优化空间复杂度。 后缀树不仅在理论上...

    suffiax array

    后缀树(Suffix Tree)和后缀数组(Suffix Array)是字符串处理领域中的两种非常重要的数据结构,它们在文本检索、生物信息学等多个领域都有广泛的应用。 - **后缀树**:后缀树是一种压缩树(compact trie),它...

    数据结构常用算法c++实现

    数据结构常用算法c++实现,程序目录如下: Array shuffle ...Word segementation(CHN/GB18030) using HMM and viterbi algorithm. A* algorithm K-Means Knuth–Morris–Pratt algorithm Disjoint-Set

    Java数据结构与算法书中源码

    1. **字典树(Trie)** - 尽管未直接提供字典树的源码,但`SuffixArray.java`可能涉及到了字典树的概念。字典树是一种用于快速查找字符串的数据结构,特别适用于存储和检索大量字符串,例如构建词典或搜索引擎。 2....

    中文关键字提取

    同时,为了提高效率,可能会采用如SA-IS(Suffix Array Construction by Induced Sorting)等算法来构建后缀数组,这是一种相对快速且内存友好的方法。 总之,"中文关键字提取"项目涉及了C++编程、字符串处理、后缀...

    各种算法模板

    本资源“各种算法模板”聚焦于两种常见的数据结构和算法:字典树(Trie)和后缀数组(Suffix Array),这些都是在解决编程竞赛如POJ(Programming Online Judge)时经常遇到的工具。 **字典树**,又称为前缀树或...

    字符串算法

    7. **Suffix Array(后缀数组)**:后缀数组是所有字符串后缀排序后的数组,可以用来高效地执行许多字符串操作,如最长重复子串、LCP(最长公共前后缀)数组的构建等。 8. **suffix tree(后缀树)**:后缀树是后缀...

    ios 模糊搜索

    3. **自定义算法实现**: 对于更复杂的模糊搜索需求,你可以编写自定义算法,如前缀树(Trie)、后缀数组(Suffix Array)或者Aho-Corasick自动机。这些方法在处理大量数据时通常能提供更好的性能。 4. **第三方库**...

    Succinct Data Structures

    4. **文本搜索索引**:例如,后缀树(Suffix Tree)或后缀数组(Suffix Array),用于快速查找文本中的模式或子串。后缀树尤其适用于大型文本文件,通过将文件视为位向量,构建的 Trie 只包含具有分支的节点,从而...

    Chapter 5 字符串 Strings.rar_核心算法-string部分

    7. **Suffix Array(后缀数组)与LCP Array(最长公共前后缀数组)**:后缀数组是字符串所有后缀排序后的结果,可以用于快速解决多种字符串问题,如查找最长重复子串、最短重复子串等。LCP数组则与后缀数组配合,...

    树状数组 后缀数组 字典树 多串匹配算法及启示

    2. **后缀数组(Suffix Array)** 后缀数组是一种用于字符串处理的高效数据结构,它存储了某个字符串的所有后缀排序后的结果。通过后缀数组,我们可以快速地进行后缀间的比较,实现诸如最长公共前后缀、最短重复子...

    字符串相关算法.rar

    7. **Suffix Array(后缀数组)**:后缀数组是字符串的所有后缀按字典序排序后的数组,可以用来解决许多字符串问题,如最长重复子串、最短重复子串、最长公共前后缀等。构造后缀数组的过程往往需要优化,比如用LCP...

    全面的算法代码库

    Algorithms   本次README修订为算法仓库Algorithms的第100次commit,首先我们庆祝自2016年8月4日本仓库建立以来Dev-XYS在算法学习方面取得的显著进步...数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)

    词典检索系统

    对于变位词的检索,可以使用特殊的算法,如前缀树(Trie)、后缀数组(Suffix Array)或Burrows-Wheeler变换(BWT),这些算法能快速找到所有可能的变位词。 3. 用户界面:提供用户友好的交互方式,使用户能够方便...

    可持久化后缀数据结构.pdf

    后缀数组(Suffix Array)是一种存储字符串所有后缀的排序后的数组。它通常用于快速查询某个字符串是否包含另一个字符串作为子串的问题,以及更复杂的应用场景,如模式匹配、重复子串查找等。在本课件中,将探讨如何...

    958117621869535《夜深人静写算法》源码.rar

    KMP算法和Rabin-Karp算法是字符串匹配的经典算法,而Suffix Array和Trie树则是高效处理字符串查询的工具。 综上所述,《夜深人静写算法》源码集合是一份宝贵的教育资源,它提供了大量实际的算法实现,涵盖了从基本...

Global site tag (gtag.js) - Google Analytics