fixes && much more efficient 'insert'
This commit is contained in:
parent
02bea100c0
commit
004d012d1b
1 changed files with 54 additions and 17 deletions
|
|
@ -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$
|
# $Source$
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
@ -17,6 +17,16 @@
|
||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
# 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
|
module Set
|
||||||
|
|
||||||
class IntSpan
|
class IntSpan
|
||||||
|
|
@ -258,7 +268,7 @@ def run_list
|
||||||
end
|
end
|
||||||
|
|
||||||
def elements
|
def elements
|
||||||
if (neg_inf? or pos_inf?)
|
if infinite?
|
||||||
print "Set::IntSpan::elements: infinite set\n"
|
print "Set::IntSpan::elements: infinite set\n"
|
||||||
exit
|
exit
|
||||||
end
|
end
|
||||||
|
|
@ -547,13 +557,6 @@ def empty?
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
def finite
|
|
||||||
if ! neg_inf? and ! pos_inf?
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
def edges
|
def edges
|
||||||
return @set["edges"]
|
return @set["edges"]
|
||||||
end
|
end
|
||||||
|
|
@ -578,8 +581,12 @@ def set_pos_inf(posInf)
|
||||||
@set["posInf"] = posInf
|
@set["posInf"] = posInf
|
||||||
end
|
end
|
||||||
|
|
||||||
def infinite
|
def finite?
|
||||||
return neg_inf? || pos_inf?
|
return (! neg_inf? and ! pos_inf?)
|
||||||
|
end
|
||||||
|
|
||||||
|
def infinite?
|
||||||
|
return ! finite?
|
||||||
end
|
end
|
||||||
|
|
||||||
def universal
|
def universal
|
||||||
|
|
@ -620,16 +627,45 @@ def insert(n)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
for i in (0...edge.length)
|
# XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken
|
||||||
if (inSet)
|
l = 0
|
||||||
n <= edge[i] and return
|
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
|
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
|
else
|
||||||
n <= edge[i] and break
|
l = i
|
||||||
inSet = true
|
i = l + ((r-l)/2)
|
||||||
end
|
end
|
||||||
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
|
inSet and return
|
||||||
|
|
||||||
lGap = i == 0 || n-1 - edge[i-1]
|
lGap = i == 0 || n-1 - edge[i-1]
|
||||||
|
|
@ -656,7 +692,7 @@ def insert(n)
|
||||||
@set["edges"] = edge
|
@set["edges"] = edge
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove(n)
|
def remove!(n)
|
||||||
n or return
|
n or return
|
||||||
|
|
||||||
inSet = neg_inf?
|
inSet = neg_inf?
|
||||||
|
|
@ -699,6 +735,7 @@ def remove(n)
|
||||||
end
|
end
|
||||||
|
|
||||||
@set["edges"] = edge
|
@set["edges"] = edge
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
def min
|
def min
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue