0
- @head = HeadNode.new(max_height)
0
- (max_height - 1).downto(0) do |cur_level|
0
- while (next_node = cur_node.forward[cur_level]) && next_node.key <= n
0
- return containing + (cur_node.markers - cur_node.endpoint_of)
0
- containing.concat(cur_node.forward_markers[cur_level])
0
- def insert(range, marker)
0
- ranges[marker] = range
0
- first_node = insert_node(range.first)
0
- first_node.endpoint_of.push(marker)
0
- last_node = insert_node(range.last)
0
- last_node.endpoint_of.push(marker)
0
- cur_level = first_node.height - 1
0
- while next_node_at_level_inside_range?(cur_node, cur_level, range)
0
- while can_ascend_from?(cur_node, cur_level) && next_node_at_level_inside_range?(cur_node, cur_level + 1, range)
0
- cur_node = mark_forward_path_at_level(cur_node, cur_level, marker)
0
- while node_inside_range?(cur_node, range)
0
- while can_descend_from?(cur_level) && next_node_at_level_outside_range?(cur_node, cur_level, range)
0
- cur_node = mark_forward_path_at_level(cur_node, cur_level, marker)
0
- range = ranges[marker]
0
- path_to_first_node = make_path
0
- first_node = find(range.first, path_to_first_node)
0
- cur_level = first_node.height - 1
0
- while next_node_at_level_inside_range?(cur_node, cur_level, range)
0
- while can_ascend_from?(cur_node, cur_level) && next_node_at_level_inside_range?(cur_node, cur_level + 1, range)
0
- cur_node = unmark_forward_path_at_level(cur_node, cur_level, marker)
0
- while node_inside_range?(cur_node, range)
0
- while can_descend_from?(cur_level) && next_node_at_level_outside_range?(cur_node, cur_level, range)
0
- cur_node = unmark_forward_path_at_level(cur_node, cur_level, marker)
0
- first_node.endpoint_of.delete(marker)
0
- if first_node.endpoint_of.empty?
0
- first_node.delete(path_to_first_node)
0
- last_node.endpoint_of.delete(marker)
0
- if last_node.endpoint_of.empty?
0
- path_to_last_node = make_path
0
- find(range.last, path_to_last_node)
0
- last_node.delete(path_to_last_node)
0
- attr_reader :head, :ranges
0
- found_node = find(key, path)
0
- if found_node && found_node.key == key
0
- return Node.new(key, next_node_height, path)
0
- found_node = find(key, path)
0
- found_node.delete(path) if found_node.key == key
0
- (max_height - 1).downto(0) do |cur_level|
0
- while (next_node = cur_node.forward[cur_level]) && next_node.key < key
0
- path[cur_level] = cur_node
0
- Array.new(max_height, nil)
0
- def can_ascend_from?(node, level)
0
- level < node.height - 1
0
- def can_descend_from?(level)
0
- def node_inside_range?(node, range)
0
- def next_node_at_level_inside_range?(node, level, range)
0
- node.forward[level] && node.forward[level].key <= range.last
0
- def next_node_at_level_outside_range?(node, level, range)
0
- (node.forward[level].nil? || node.forward[level].key > range.last)
0
- def mark_forward_path_at_level(node, level, marker)
0
- node.forward_markers[level].push(marker)
0
- next_node = node.forward[level]
0
- next_node.markers.push(marker)
0
- def unmark_forward_path_at_level(node, level, marker)
0
- node.forward_markers[level].delete(marker)
0
- next_node = node.forward[level]
0
- next_node.markers.delete(marker)
0
- cur_node = head.forward[0]
0
- cur_node = cur_node.forward[0]
0
- attr_reader :height, :forward, :forward_markers
0
- def initialize(height)
0
- @forward = Array.new(height, nil)
0
- @forward_markers = Array.new(height) {|i| []}
0
- attr_reader :key, :markers, :endpoint_of
0
- def initialize(key, height, path)
0
- update_forward_pointers(path)
0
- 0.upto(height - 1) do |i|
0
- path[i].forward[i] = forward[i]
0
- def update_forward_pointers(path)
0
- 0.upto(height - 1) do |i|
0
- forward[i] = path[i].forward[i]
0
- path[i].forward[i] = self
0
- def promote_markers(path)
0
- 0.upto(height - 1) do |i|
0
- incoming_markers = path[i].forward_markers[i]
0
- markers.concat(incoming_markers)
0
- incoming_markers.each do |marker|
0
- if can_be_promoted_higher?(marker, i)
0
- new_promoted.push(marker)
0
- forward[i].delete_marker_from_path(marker, i, forward[i+1])
0
- forward_markers[i].push(marker)
0
- promoted.each do |marker|
0
- if can_be_promoted_higher?(marker, i)
0
- new_promoted.push(marker)
0
- forward[i].delete_marker_from_path(marker, i, forward[i+1])
0
- forward_markers[i].push(marker)
0
- promoted = new_promoted
0
- def demote_markers(path)
0
- (height - 1).downto(0) do |i|
0
- incoming_markers = path[i].forward_markers[i].dup
0
- incoming_markers.each do |marker|
0
- unless node_in_range_reachable_from_level?(marker, i)
0
- path[i].forward_markers[i].delete(marker)
0
- new_demoted.push(marker)
0
- demoted.each do |marker|
0
- path[i+1].place_marker_on_inbound_path(marker, i, path[i])
0
- if forward[i].markers.include?(marker)
0
- path[i].forward_markers[i].push(marker)
0
- new_demoted.push(marker)
0
- (height - 1).downto(0) do |i|
0
- forward_markers[i].each do |marker|
0
- new_demoted.push(marker) unless path[i].forward_markers[i].include?(marker)
0
- demoted.each do |marker|
0
- forward[i].place_marker_on_outbound_path(marker, i, forward[i + 1])
0
- new_demoted.push(marker) unless path[i].forward_markers[i].include?(marker)
0
- def node_in_range_reachable_from_level?(marker, level)
0
- level.upto(height - 1) do |i|
0
- return true if forward[i].markers.include?(marker)
0
- def can_be_promoted_higher?(marker, level)
0
- level < height - 1 && forward[level + 1] && forward[level + 1].markers.include?(marker)
0
- def delete_marker_from_path(marker, level, terminus)
0
- until cur_node == terminus
0
- cur_node.forward_markers[level].delete(marker)
0
- cur_node.markers.delete(marker)
0
- cur_node = cur_node.forward[level]
0
- def place_marker_on_outbound_path(marker, level, terminus)
0
- until cur_node == terminus
0
- cur_node.forward_markers[level].push(marker)
0
- cur_node.markers.push(marker)
0
- cur_node = cur_node.forward[level]
0
- def place_marker_on_inbound_path(marker, level, terminus)
0
- until cur_node == terminus
0
- cur_node.forward_markers[level].push(marker)
0
- cur_node = cur_node.forward[level]
0
- cur_node.markers.push(marker)
0
\ No newline at end of file
0
+dir = File.dirname(__FILE__)
0
+require "#{dir}/interval_skip_list/interval_skip_list.rb"
0
+require "#{dir}/interval_skip_list/head_node.rb"
0
+require "#{dir}/interval_skip_list/node.rb"
0
\ No newline at end of file
Comments
No one has commented yet.