Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

heapq

標準でないのかな???
なのでpythonから引っ張ってくる。
Arrayに突っ込む。


class Array
  
  def heappush(item)
    self.push(item)
    siftdown(0, self.length - 1)
  end
  
  def heappop
    lastelt = self.pop()
    if self.length > 0
        returnitem = self[0]
        self[0] = lastelt
        siftup(0)
    else
        returnitem = lastelt
    end
    return returnitem
  end
  
  def heapify
    n = self.length
    (n/2).downto(0){|x|
      siftup(x)
    }
  end

  private
  def siftdown(startpos, pos)
    newitem = self[pos]
    while pos > startpos
        parentpos = (pos - 1) >> 1
        parent = self[parentpos]
        if newitem < parent
            self[pos] = parent
            pos = parentpos
            next
        end
        break
    end
    self[pos] = newitem
  end

  private
  def siftup(pos)
    endpos = self.length
    startpos = pos
    newitem = self[pos]
    childpos = 2*pos + 1
    while childpos < endpos
        rightpos = childpos + 1
        if rightpos < endpos and not self[childpos] < self[rightpos]
            childpos = rightpos
        end
        
        self[pos] = self[childpos]
        pos = childpos
        childpos = 2*pos + 1
    end
    self[pos] = newitem
    siftdown(startpos, pos)
    return nil
  end 

end

bisect(bsearch)は確か高林さんが作ったのがあったな。