我想找到最有效的C程序來存儲N個最大值從傳入數據流。例如。假設傳入的數據是每個32bytes,並且是來自傳感器的連續流,我需要存儲流中N個最大值(允許的副本)。 簡單的方法是迭代並找到位置,然後將所有元素移動1(可能丟棄當前最小值)。有沒有更好的方法來做到這一點?排序插入到一個固定大小的陣列與複製
//MAX_KEEP 32
typedef struct accel_sys
{
FILE *infile;
/* Data for largest and last */
u32 largest[MAX_KEEP]; /* largest in highest index, smallest in lowest index */
u32 last[MAX_KEEP]; /* circular buffer */
u8 last_start; /* points to the oldest value */
/* Data for reading and processing the file */
u8 last_byte;
Bool even;
int num_read;
} accel_t;
typedef accel_t * accel_h;
static void store_max(accel_h accel, u32 cur_value)
{
int i = MAX_KEEP-1;
int j = 0;
while(i >= 0)
{
if(cur_value > accel->largest[i])
{
/* found it */
break;
}
i--;
}
/* i < 0 if the value doesn't belong in the array, do nothing in that case */
if(i >= 0)
{
/* Move everything lower than cur_value down, losing the last value,
* then store our new value in our found spot */
j = 0;
while(j < i)
{
accel->largest[j] = accel->largest[j+1];
j++;
}
accel->largest[i] = cur_value;
}
}
你的算法是合理的。還有其他的數據結構可能更適合您的需求,但是如果您嚴格考慮使用數組,您可以放棄自己需要重複移位並改爲使用memmove。 'memmove(accel,accel + 1,i);' – bentank
如果傳入的數據是每個32字節,將它存儲在'u16'中可能不是最好的想法... – abarnert
值是否符合可以被分類的範圍'如{小,中,大}或類似的小範圍?這樣的分佈是否相當均衡,還是會偏向一側? 如果分佈相當平衡,一個簡單的優化就是使用散列來存儲表示這個較小範圍的K數組(例如:3個桶)。這有點類似於基數排序。您的基本插入排序算法仍然適用,但只適用於每個存儲桶。 –