This repository was archived by the owner on Jan 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexercise10.rb
More file actions
72 lines (65 loc) · 1.5 KB
/
Copy pathexercise10.rb
File metadata and controls
72 lines (65 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Exercise 10
class OrderedDouble
attr_reader :array
def initialize(size)
@size=size
@array=Array.new(size)
end
def addValue(id,value)
k=id % @size
s,v=0,nil
duplicate=false
original=value
p=Random.new(id).rand(0..@size-1)
while((r=@array[(k+s*p)%@size])!=nil&&r!=:deleted&&s<@size-1)
if(r.id==id)
duplicate=true
break
elsif(r.id>id)
id,r.id=r.id,id
value,r.value=r.value,value
p=Random.new(id).rand(0..@size-1) # step size for larger element
k=(k+s*p)%@size # larger element taken from this position
s=1 # start 1*p unit from k
else
s+=1
end
end
if(!duplicate&&r==nil||r==:deleted)
@array[(k+s*p)%@size] = Element.new(id,value)
v=original
end
return v
end
def getValue(id,sequence=nil)
k=id % @size
s,v=0,nil
p=Random.new(id).rand(0..@size-1)
while((((r=@array[(k+s*p)%@size])==:deleted)||
(r!=nil&&r.id<id))&&
s<@size-1)
s+=1
end
if(sequence.nil?)
return !r.nil?&&r!=:deleted&&
r.id==id ? r.value : nil
elsif(sequence)
return s+1
end
end
def deleteValue(id)
k=id % @size
s,v=0,nil
p=Random.new(id).rand(0..@size-1)
while((((r=@array[(k+s*p)%@size])==:deleted)||
(r!=nil&&r.id<id))&&
s<@size-1)
s+=1
end
if(!r.nil?&&r!=:deleted&&r.id==id)
v=r.value
@array[(k+s*p)%@size]=:deleted
end
return v
end
end