• Jump To … +
    dawg.coffee max-heap.coffee index.coffee builder.coffee distance.coffee transducer.coffee mutate.coffee operations.coffee permutations.coffee truth-table.coffee
  • max-heap.coffee

  • ¶
    class MaxHeap
      _parent: (i) ->
  • ¶

    Index of the parent of the element of A, having the index, i

        if i > 0 then ((i + 1) >> 1) - 1 else 0
      _left_child: (i) ->
  • ¶

    Index of the left child of the element of A, having the index, i

        (i << 1) + 1
      _right_child: (i) ->
  • ¶

    Index of the right child of the element of A, having the index, i

        (i << 1) + 2
      _heapify: (i) ->
  • ¶

    Modifies the heap array, A, such that its index, i, points to the root of a sub-heap.

        l = @_left_child(i)
        r = @_right_child(i)
        heap = @['heap']
        if l < @['length'] and @f(heap[l], heap[i]) > 0
          largest = l
        else
          largest = i
        if r < @['length'] and @f(heap[r], heap[largest]) > 0
          largest = r
        if largest isnt i
          tmp = heap[i]
          heap[i] = heap[largest]
          heap[largest] = tmp
          @_heapify(largest)
        null
      _build: () ->
        i = @['length'] >> 1
        while i >= 0
          @_heapify(i)
          i -= 1
        null
      'increase_key': (i, key) ->
        f = @f
        heap = @['heap']
        if f(key, heap[i]) < 0
          throw new Error("Expected #{key} to be at least heap[#{i}] = #{heap[i]}")
        heap[i] = key
        parent = @_parent
        p = parent(i)
        while i and f(heap[p], heap[i]) < 0
          tmp = heap[i]
          heap[i] = heap[p]
          heap[p] = tmp
          i = p
          p = parent(i)
        null
      'sort': () ->
        @_build()
        i = @['length'] - 1
        heap = @['heap']
        while i >= 0
          tmp = heap[0]
          heap[0] = heap[i]
          heap[i] = tmp
          @['length'] -= 1
          @_heapify(0)
          i -= 1
        null
      'peek': () ->
        if @['length']
          @['heap'][0]
        else
          null
      'pop': () ->
        if @['length']
          heap = @['heap']
          max = heap[0]
          heap[0] = heap[@['length'] - 1]
          @['length'] -= 1
          @_heapify(0)
          max
        else
          null
      'push': (key) ->
        i = @['length']
        @['length'] += 1
        parent = @_parent
        p = parent(i)
        heap = @['heap']
        f = @f
        while i > 0 and f(heap[p], key) < 0
          heap[i] = heap[p]
          i = p
          p = parent(i)
        heap[i] = key
        null
      constructor: (f, heap, length) ->
        heap = [] unless heap
        unless typeof heap.length is 'number'
          throw new Error("heap must be array-like")
        unless typeof length is 'number'
          length = if heap then heap.length else 0
        unless typeof f is 'function'
          throw new Error("f must be a function")
        unless 0 <= length <= heap.length
          throw new Error("Expected 0 <= heap length = #{length} <= #{heap.length} = heap size")
        @f = f
        @['heap'] = heap
        @['length'] = length
        @_build()
    
    global =
      if typeof exports is 'object'
        exports
      else if typeof window is 'object'
        window
      else
        this
    
    global['levenshtein'] ||= {}
    global['levenshtein']['MaxHeap'] = MaxHeap