50 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2010 Dmitry Shubin.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: arrays help.markup help.syntax sequences ;
 | 
						|
IN: z-algorithm
 | 
						|
 | 
						|
HELP: lcp
 | 
						|
{ $values
 | 
						|
  { "seq1" sequence } { "seq2" sequence }
 | 
						|
  { "n" "a non-negative integer" }
 | 
						|
}
 | 
						|
{ $description
 | 
						|
  "Outputs the length of longest common prefix of two sequences."
 | 
						|
} ;
 | 
						|
 | 
						|
HELP: z-values
 | 
						|
{ $values
 | 
						|
  { "seq" sequence } { "Z" array }
 | 
						|
}
 | 
						|
{ $description
 | 
						|
  "Outputs an array of the same length as " { $snippet "seq" }
 | 
						|
  ", containing Z-values for given sequence. See "
 | 
						|
  { $link "z-algorithm" } " for details."
 | 
						|
} ;
 | 
						|
 | 
						|
ARTICLE: "z-algorithm" "Z algorithm"
 | 
						|
{ $heading "Definition" }
 | 
						|
"Given the sequence " { $snippet "S" } " and the index "
 | 
						|
{ $snippet "i" } ", let " { $snippet "i" } "-th Z value of "
 | 
						|
{ $snippet "S" } " be the length of the longest subsequence of "
 | 
						|
{ $snippet "S" } " that starts at " { $snippet "i" }
 | 
						|
" and matches the prefix of " { $snippet "S" } "."
 | 
						|
 | 
						|
{ $heading "Example" }
 | 
						|
"Here is an example for string " { $snippet "\"abababaca\"" } ":"
 | 
						|
{ $table
 | 
						|
  { { $snippet "i:" } "0" "1" "2" "3" "4" "5" "6" "7" "8" }
 | 
						|
  { { $snippet "S:" } "a" "b" "a" "b" "a" "b" "a" "c" "a" }
 | 
						|
  { { $snippet "Z:" } "9" "0" "5" "0" "3" "0" "1" "0" "1" }
 | 
						|
}
 | 
						|
 | 
						|
{ $heading "Summary" }
 | 
						|
"The " { $vocab-link "z-algorithm" }
 | 
						|
" vocabulary implements algorithm for finding all Z values for sequence "
 | 
						|
{ $snippet "S" }
 | 
						|
" in linear time. In contrast to naive approach which takes "
 | 
						|
{ $snippet "Θ(n^2)" } " time."
 | 
						|
;
 | 
						|
 | 
						|
ABOUT: "z-algorithm"
 |