fixes && much more efficient 'insert'

This commit is contained in:
Ward Wouts 2005-03-09 18:14:56 +00:00
parent 02bea100c0
commit 004d012d1b

View file

@ -1,4 +1,4 @@
# $Dwarf: intspan.rb,v 1.16 2005/03/09 14:22:52 ward Exp $
# $Dwarf: intspan.rb,v 1.17 2005/03/09 15:02:21 ward Exp $
# $Source$
#
@ -17,6 +17,16 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
class Integer
def even?
return self%2 == 0
end
def odd?
return self%2 == 1
end
end
module Set
class IntSpan
@ -258,7 +268,7 @@ def run_list
end
def elements
if (neg_inf? or pos_inf?)
if infinite?
print "Set::IntSpan::elements: infinite set\n"
exit
end
@ -547,13 +557,6 @@ def empty?
return true
end
def finite
if ! neg_inf? and ! pos_inf?
return true
end
return false
end
def edges
return @set["edges"]
end
@ -578,8 +581,12 @@ def set_pos_inf(posInf)
@set["posInf"] = posInf
end
def infinite
return neg_inf? || pos_inf?
def finite?
return (! neg_inf? and ! pos_inf?)
end
def infinite?
return ! finite?
end
def universal
@ -620,16 +627,45 @@ def insert(n)
return
end
for i in (0...edge.length)
if (inSet)
n <= edge[i] and return
# XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken
l = 0
r = edge.length-1
i = r/2
#p "edge #{edge}"
#p "n #{n}"
while true
# p "i #{i}"
# p "edge[i] #{edge[i]}"
if n < edge[i] && n > edge[i-1]
inSet = i.odd?
break
elsif n < edge[i] && i == 0
inSet = false
# p "break 1"
break
elsif n < edge[i]
r = i
i = l + ((r-l)/2)
elsif n == edge[i]
# p "break 1"
inSet = i.odd?
break
else
n <= edge[i] and break
inSet = true
l = i
i = l + ((r-l)/2)
end
end
#for i in (0...edge.length)
# if (inSet)
# n <= edge[i] and return
# inSet = false
# else
# n <= edge[i] and break
# inSet = true
# end
#end
inSet and return
lGap = i == 0 || n-1 - edge[i-1]
@ -656,7 +692,7 @@ def insert(n)
@set["edges"] = edge
end
def remove(n)
def remove!(n)
n or return
inSet = neg_inf?
@ -699,6 +735,7 @@ def remove(n)
end
@set["edges"] = edge
return self
end
def min