您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

C语言中的滚动中位数-Turlach实现

C语言中的滚动中位数-Turlach实现

我已经在C中实现了滚动中位数计算器(Gist)。它使用max-median-min堆结构:中位数位于heap [0](位于K项数组的中心)。从heap [1]开始有一个minheap,在heap [-1]有一个maxheap(使用负索引)。 它与R源中Turlach实现不完全相同:它支持即时插入值,而R版本一次作用于整个缓冲区。但是我相信时间复杂度是相同的。而且它可以轻松地用于实现整个缓冲区版本(可能添加一些代码来处理R的“ endrules”)

接口:

//Customize for your data Item type
typedef int Item;
#define ItemLess(a,b)  ((a)<(b))
#define ItemMean(a,b)  (((a)+(b))/2)

typedef struct Mediator_t Mediator;

//creates new Mediator: to calculate `nItems` running median. 
//mallocs single block of memory, caller must free.
Mediator* MediatorNew(int nItems);

//returns median item (or average of 2 when item count is even)
Item MediatorMedian(Mediator* m);

//Inserts item, maintains median in O(lg nItems)
void MediatorInsert(Mediator* m, Item v)
{
   int isNew = (m->ct < m->N);
   int p = m->pos[m->idx];
   Item old = m->data[m->idx];
   m->data[m->idx] = v;
   m->idx = (m->idx+1) % m->N;
   m->ct += isNew;
   if (p > 0)         //new item is in minHeap
   {  if (!isNew && ItemLess(old, v)) { minSortDown(m, P*2);  }
      else if (minSortUp(m, p)) { maxSortDown(m,-1); }
   }
   else if (p < 0)   //new item is in maxheap
   {  if (!isNew && ItemLess(v, old)) { maxSortDown(m, P*2); }
      else if (maxSortUp(m, p)) { minSortDown(m, 1); }
   }
   else            //new item is at median
   {  if (maxCt(m)) { maxSortDown(m,-1); }
      if (minCt(m)) { minSortDown(m, 1); }
   }
}
其他 2022/1/1 18:15:02 有774人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶