示例#1
0
文件: heap.c 项目: maxenglander/algo1
void heap_bubble_down(Heap* heap, int index) {
  if(heap_left_child_index(index) <= heap_last_index(heap)) {
    int left_compare = heap->comparator(heap_get(heap, index), heap_left_child(heap, index));
    if(1 == left_compare) {
      heap_swap(heap, index, heap_left_child_index(index));
      heap_bubble_down(heap, heap_left_child_index(index));
      return;
    } 
  }
  
  if(heap_right_child_index(index) <= heap_last_index(heap)) {
    int right_compare = heap->comparator(heap_get(heap, index), heap_right_child(heap, index));
    if(1 == right_compare) {
      heap_swap(heap, index, heap_right_child_index(index));
      heap_bubble_down(heap, heap_right_child_index(index));
      return;
    }
  }

  return;
}
示例#2
0
文件: heap.c 项目: maxenglander/algo1
void* heap_extract_min(Heap* heap) {
  void* min = heap_min(heap);

  if(heap_size(heap) > 0) {
    heap_set(heap, 0, heap_last(heap));
    heap_bubble_down(heap, 0);
  }

  heap->size--;

  return min;
}
示例#3
0
int avfilter_graph_request_oldest(AVFilterGraph *graph)
{
    while (graph->sink_links_count) {
        AVFilterLink *oldest = graph->sink_links[0];
        int r = avfilter_request_frame(oldest);
        if (r != AVERROR_EOF)
            return r;
        /* EOF: remove the link from the heap */
        if (oldest->age_index < --graph->sink_links_count)
            heap_bubble_down(graph, graph->sink_links[graph->sink_links_count],
                             oldest->age_index);
        oldest->age_index = -1;
    }
    return AVERROR_EOF;
}
示例#4
0
void heap_remove_top(heap_t* heap)
{
    if(heap->n_elements == 1)
    {
        free(heap->top);
        heap->top = NULL;
        heap->n_elements--;
    }
    else
    {
        memcpy(heap->top, ELEMENT(heap, heap->n_elements - 1), heap->element_size);
        heap->n_elements--;
        heap->top = realloc(heap->top, heap->element_size * heap->n_elements);
        heap_bubble_down(heap, 0);
    }
}
示例#5
0
int avfilter_graph_request_oldest(AVFilterGraph *graph)
{
    while (graph->sink_links_count) {
        AVFilterLink *oldest = graph->sink_links[0];
        int r = ff_request_frame(oldest);
        if (r != AVERROR_EOF)
            return r;
        av_log(oldest->dst, AV_LOG_DEBUG, "EOF on sink link %s:%s.\n",
               oldest->dst ? oldest->dst->name : "unknown",
               oldest->dstpad ? oldest->dstpad->name : "unknown");
        /* EOF: remove the link from the heap */
        if (oldest->age_index < --graph->sink_links_count)
            heap_bubble_down(graph, graph->sink_links[graph->sink_links_count],
                             oldest->age_index);
        oldest->age_index = -1;
    }
    return AVERROR_EOF;
}
示例#6
0
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link)
{
    heap_bubble_up  (graph, link, link->age_index);
    heap_bubble_down(graph, link, link->age_index);
}