当设计一个会缩小的动态数组时,跟踪最高使用指数的方法是什么,当删除该索引的保持对象时,找到新的最高使用指数。
现在我可以想到一个简单的int last_used
,然后收取维护此变量的成本到func_delete
,这必须检查它是否删除最高,如果是,请检查每个较小的值寻找非空。 (数组将始终为null初始化)
if(last_index == deleted_index){
while(last_index >0 && array[--last_index] != NULL)
// if the array is now only half full, I realloc
}
还有其他聪明的方法吗?
答案 0 :(得分:1)
对我来说看起来没问题,但逻辑明智,如果函数func_delete
总是删除最高项,那么在较小的索引处不应该有任何NULL
值。所以这应该做:
if(last_index == deleted_index && array[last_index] != NULL) {
//delete last item
free(array[last_index]);
//set to NULL and decrement
array[last_index--] = NULL;
}
修改强>:
根据您的评论,我了解您正在尝试做什么,我认为您可以直接跟踪插入函数中使用率最高的索引:
void array_insert(array , element e, int index)
{
if (index > arr->highest_index) {
arr->highest_index = index;
}
//insert element
}
当你删除时,检查索引是否最高。就像你在做的那样,不要认为有更好的方法可以做到这一点,而不会使事情进一步复杂化,例如,你可以保留另一个排序的索引列表,这样当你删除最高索引时,你会发现下一个索引恒定的时间,但就像我说的那样,它使事情复杂化。但是,我认为另一种数据结构可能更有用,例如链接列表在随机删除节点时更有效,但在随机插入节点时则不然。