动态数组自动缩小

时间:2012-11-09 07:06:13

标签: c arrays algorithm data-structures

当设计一个会缩小的动态数组时,跟踪最高使用指数的方法是什么,当删除该索引的保持对象时,找到新的最高使用指数

现在我可以想到一个简单的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 
} 

还有其他聪明的方法吗?

1 个答案:

答案 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
}

当你删除时,检查索引是否最高。就像你在做的那样,不要认为有更好的方法可以做到这一点,而不会使事情进一步复杂化,例如,你可以保留另一个排序的索引列表,这样当你删除最高索引时,你会发现下一个索引恒定的时间,但就像我说的那样,它使事情复杂化。但是,我认为另一种数据结构可能更有用,例如链接列表在随机删除节点时更有效,但在随机插入节点时则不然。