28 |
28 |
thresh = []
|
29 |
29 |
links = []
|
30 |
30 |
|
31 |
|
(astart..afinish).each { |aindex|
|
|
31 |
(astart..afinish).each do |aindex|
|
32 |
32 |
aelem = a[aindex]
|
33 |
33 |
next unless bmatches.has_key? aelem
|
34 |
34 |
k = nil
|
35 |
|
bmatches[aelem].reverse.each { |bindex|
|
36 |
|
if k && (thresh[k] > bindex) && (thresh[k-1] < bindex)
|
37 |
|
thresh[k] = bindex
|
38 |
|
else
|
39 |
|
k = thresh.replacenextlarger(bindex, k)
|
40 |
|
end
|
41 |
|
links[k] = [ (k==0) ? nil : links[k-1], aindex, bindex ] if k
|
42 |
|
}
|
43 |
|
}
|
|
35 |
bmatches[aelem].reverse.each do |bindex|
|
|
36 |
if k && (thresh[k] > bindex) && (thresh[k-1] < bindex)
|
|
37 |
thresh[k] = bindex
|
|
38 |
else
|
|
39 |
k = thresh.replacenextlarger(bindex, k)
|
|
40 |
end
|
|
41 |
links[k] = [ (k==0) ? nil : links[k-1], aindex, bindex ] if k
|
|
42 |
end
|
|
43 |
end
|
44 |
44 |
|
45 |
45 |
if !thresh.empty?
|
46 |
46 |
link = links[thresh.length-1]
|
47 |
47 |
while link
|
48 |
|
mvector[link[1]] = link[2]
|
49 |
|
link = link[0]
|
|
48 |
mvector[link[1]] = link[2]
|
|
49 |
link = link[0]
|
50 |
50 |
end
|
51 |
51 |
end
|
52 |
52 |
|
... | ... | |
59 |
59 |
while ai < mvector.length
|
60 |
60 |
bline = mvector[ai]
|
61 |
61 |
if bline
|
62 |
|
while bi < bline
|
63 |
|
discardb(bi, b[bi])
|
64 |
|
bi += 1
|
65 |
|
end
|
66 |
|
match(ai, bi)
|
67 |
|
bi += 1
|
|
62 |
while bi < bline
|
|
63 |
discardb(bi, b[bi])
|
|
64 |
bi += 1
|
|
65 |
end
|
|
66 |
match(ai, bi)
|
|
67 |
bi += 1
|
68 |
68 |
else
|
69 |
|
discarda(ai, a[ai])
|
|
69 |
discarda(ai, a[ai])
|
70 |
70 |
end
|
71 |
71 |
ai += 1
|
72 |
72 |
end
|
... | ... | |
79 |
79 |
bi += 1
|
80 |
80 |
end
|
81 |
81 |
match(ai, bi)
|
82 |
|
1
|
|
82 |
return 1
|
83 |
83 |
end
|
84 |
84 |
|
85 |
85 |
def compactdiffs
|
86 |
86 |
diffs = []
|
87 |
|
@diffs.each { |df|
|
|
87 |
@diffs.each do |df|
|
88 |
88 |
i = 0
|
89 |
89 |
curdiff = []
|
90 |
90 |
while i < df.length
|
91 |
|
whot = df[i][0]
|
92 |
|
s = @isstring ? df[i][2].chr : [df[i][2]]
|
93 |
|
p = df[i][1]
|
94 |
|
last = df[i][1]
|
95 |
|
i += 1
|
96 |
|
while df[i] && df[i][0] == whot && df[i][1] == last+1
|
97 |
|
s << df[i][2]
|
98 |
|
last = df[i][1]
|
99 |
|
i += 1
|
100 |
|
end
|
101 |
|
curdiff.push [whot, p, s]
|
|
91 |
whot = df[i][0]
|
|
92 |
s = @isstring ? df[i][2].chr : [df[i][2]]
|
|
93 |
p = df[i][1]
|
|
94 |
last = df[i][1]
|
|
95 |
i += 1
|
|
96 |
while df[i] && df[i][0] == whot && df[i][1] == last+1
|
|
97 |
s << df[i][2]
|
|
98 |
last = df[i][1]
|
|
99 |
i += 1
|
|
100 |
end
|
|
101 |
curdiff.push [whot, p, s]
|
102 |
102 |
end
|
103 |
103 |
diffs.push curdiff
|
104 |
|
}
|
|
104 |
end
|
105 |
105 |
return diffs
|
106 |
106 |
end
|
107 |
107 |
|
... | ... | |
157 |
157 |
|
158 |
158 |
def reverse_hash(range = (0...self.length))
|
159 |
159 |
revmap = {}
|
160 |
|
range.each { |i|
|
|
160 |
range.each do |i|
|
161 |
161 |
elem = self[i]
|
162 |
162 |
if revmap.has_key? elem
|
163 |
|
revmap[elem].push i
|
|
163 |
revmap[elem].push i
|
164 |
164 |
else
|
165 |
|
revmap[elem] = [i]
|
|
165 |
revmap[elem] = [i]
|
166 |
166 |
end
|
167 |
|
}
|
|
167 |
end
|
168 |
168 |
return revmap
|
169 |
169 |
end
|
170 |
170 |
|
... | ... | |
181 |
181 |
found = self[index]
|
182 |
182 |
return nil if value == found
|
183 |
183 |
if value > found
|
184 |
|
low = index + 1
|
|
184 |
low = index + 1
|
185 |
185 |
else
|
186 |
|
high = index
|
|
186 |
high = index
|
187 |
187 |
end
|
188 |
188 |
end
|
189 |
189 |
|
... | ... | |
204 |
204 |
end
|
205 |
205 |
ai = 0
|
206 |
206 |
bi = 0
|
207 |
|
diff.diffs.each { |d|
|
208 |
|
d.each { |mod|
|
209 |
|
case mod[0]
|
210 |
|
when '-'
|
211 |
|
while ai < mod[1]
|
212 |
|
newary << self[ai]
|
213 |
|
ai += 1
|
214 |
|
bi += 1
|
215 |
|
end
|
216 |
|
ai += 1
|
217 |
|
when '+'
|
218 |
|
while bi < mod[1]
|
219 |
|
newary << self[ai]
|
220 |
|
ai += 1
|
221 |
|
bi += 1
|
|
207 |
diff.diffs.each do |d|
|
|
208 |
d.each do |mod|
|
|
209 |
case mod[0]
|
|
210 |
when '-'
|
|
211 |
while ai < mod[1]
|
|
212 |
newary << self[ai]
|
|
213 |
ai += 1
|
|
214 |
bi += 1
|
|
215 |
end
|
|
216 |
ai += 1
|
|
217 |
when '+'
|
|
218 |
while bi < mod[1]
|
|
219 |
newary << self[ai]
|
|
220 |
ai += 1
|
|
221 |
bi += 1
|
|
222 |
end
|
|
223 |
newary << mod[2]
|
|
224 |
bi += 1
|
|
225 |
else
|
|
226 |
raise "Unknown diff action"
|
|
227 |
end
|
|
228 |
end
|
222 |
229 |
end
|
223 |
|
newary << mod[2]
|
224 |
|
bi += 1
|
225 |
|
else
|
226 |
|
raise "Unknown diff action"
|
227 |
|
end
|
228 |
|
}
|
229 |
|
}
|
230 |
230 |
while ai < self.length
|
231 |
231 |
newary << self[ai]
|
232 |
232 |
ai += 1
|