【问题标题】:Big O(N) difference while using 2 different appraoches使用 2 种不同方法时的 O(N) 差异很大
【发布时间】:2017-02-25 20:39:48
【问题描述】:

我的问题如下:

我有一个函数来操作 MAX 元素数组的内容。该函数将如下所示:

    //GLobal Variables
    uint8_t my_array[ MAX ];
    #define EMPTY 0xFF

    ...
    void initArray( void )
    {
        for( uint8_t i=0; i<MAX; i++ )
        {
             my_array[ i ] = EMPTY;   
        }
    }
    void manipulateArray( uint8_t value )
    {
        for( uint8_t i=0; i<MAX; i++ )
        {
             if( EMPTY == my_array[ i ] )
             {
                  my_array[ i ] = value;
                  break;
              }
        }
    }

    ...

    int main( void )
    {
         ...
         initArray();
         ...
         while( false == exit_flag )
         {
               manipulateArray( value );
               //get new value from user
               //update exit_flag based on new value
         }
         ...
         return 0;
    }

但后来我想,如果我最终做了很多插入/删除,那么我会疯狂地使用 for 循环,这势必会影响程序的速度或大 O(N)。所以我想如果我使用另一个全局

变量来跟踪数组中下一个空运动的插入位置,而不是每次都循环遍历它:

//GLobal Variables
uint8_t my_array[ MAX ];
uint8_t idx = 0;

...

void manipulateArray( uint8_t value )
{
    my_array[ idx++ ] = value;
} 

我的假设是否正确?同样,在这种特殊情况下,最好使用另一种更适合操作性质的数据结构(大量插入和少量删除):向量、链表......

提前致谢,

【问题讨论】:

  • 全局变量;哎呀。
  • 这与您提出的问题无关,但-1 == my_array[i] 怎么可能是真的?
  • “我的假设是否正确”。是的。 “这个特殊情况”。什么特殊情况?如果没有对总体目标的更详细要求,很难评估什么是好的方法?更多的插入?更多删除?没有删减?随意查找?等等……
  • 代码的第一个版本将当前等于 255 的每个元素设置为 value(除非 MAX &gt; 255 在这种情况下它不会终止)。第二个版本将数组的一个值(索引:0、1、...、255、0、1、...)设置为value。看起来他们根本不一样。
  • @PaulHankin touche.

标签: c++ c loops big-o


【解决方案1】:

一般地解释你,我认为你是在询问“插入”值覆盖EMPTY 值的问题,以及通过用EMPTY 替换它们来“删除”值的问题。在这种情况下,您建议维护一个跟踪下一个“空”位置的全局变量,以避免必须在数组中搜索该位置。

确实,如果您知道下一个插入位置的位置,那么您可以在 O(1) 步骤中执行插入,而如果您需要执行线性搜索,则最好的界限是 O(n)。如果您始终在数组(的非空部分)的末尾插入或删除,那么维护您建议的元数据是一个非常好的策略,因为您可以在 O(1) 步骤中维护辅助变量,也是。

但是假设您需要支持从任意位置删除,而不移动其他数组元素,并且您还希望能够使用插入函数重新填充这些位置。在这种情况下,您必须解决维护有关多个空位置的信息的问题。单个标量变量是不够的,依赖数组本身需要您在数组中搜索空位置,这又回到了您开始的位置。

另一种方法是使用更复杂的数据结构——例如数组或链表——来跟踪主数组中的开口。通过这种方式,您可以在任何序列中的任何位置实现任意数量的插入和删除的 O(1) 复杂度,代价是使用 O(n) memory 来维护关于开放数组位置的元数据.这是典型的空间与速度权衡:实现更快的算法需要使用更多内存,但您可以通过使用更慢的算法来节省内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多