栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 typetypedef 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); }   }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636810.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号