二维数组的大O插入

时间:2015-06-10 08:57:34

标签: c++ c arrays big-o

如果我有N x N 2维数组且名称是。

int a[N][N];

当我在任何数组中插入任何值时,例如a[N-1][N-1]=1,需要多长时间?

O(N^2)O(1)

4 个答案:

答案 0 :(得分:4)

你没有插入,对吧?您正在分配,直接指向特定地址,而且您不需要事先弄清楚正确的位置。

这意味着你不需要做任何循环,在找到位置并分配之前不需要经历任何计算,并且已经分配了内存。

所以它是O(1),常数​​与输入无关。

答案 1 :(得分:0)

由于您将值直接赋值给数组中的特定位置,因此ORDER将为O(1)

如果你通过2个循环迭代它,那么它将是O(n ^ 2),因为对于每个i,将有一个完整的j迭代。例如:

for(int i=0; i<n;i++){
 for(int j=0; j<n;j++){
 }
}

答案 2 :(得分:0)

  1. 我想你在谈论有序数组,因为无序是O(1)。将元素[n] [m]复制到末尾并将新元素放入[n] [m]
  2. 我认为你在谈论插入而不是分配,因为对于分配它是O(1)。
  3. 如果你的数组是有序的,那么O(N * N)来移动所有元素

答案 3 :(得分:0)

c中的赋值操作可以作为基元的O(1)进行威胁

然而:如果你为随机位置做了很多任务,那么其他球员就会出现在场上......

考虑以下两个例子:

ex1.c中:

import xlrd
from openpyxl.workbook import Workbook as openpyxlWorkbook

# content is a string containing the file. For example the result of an http.request(url).
# You can also use a filepath by calling "xlrd.open_workbook(filepath)".

xlsBook = xlrd.open_workbook(file_contents=content)
workbook = openpyxlWorkbook()

for i in xrange(0, xlsBook.nsheets):
    xlsSheet = xlsBook.sheet_by_index(i)
    sheet = workbook.active if i == 0 else workbook.create_sheet()
    sheet.title = xlsSheet.name

    for row in xrange(0, xlsSheet.nrows):
        for col in xrange(0, xlsSheet.ncols):
            sheet.cell(row=row, column=col).value = xlsSheet.cell_value(row, col)

# The new xlsx file is in "workbook", without iterators (iter_rows).
# For iteration, use "for row in worksheet.rows:".
# For range iteration, use "for row in worksheet.range("{}:{}".format(startCell, endCell)):".

ex2.cpp:

#define W 1<<12
#define H W
int a[H][W];

int main(){

    for(int j=0;j< W ;j++){
    for(int i=0;i< H ;i++){
       a[i][j]=1;
    }
    }
    return 0;
}

你可以看到ex1慢了!

取决于使用的编译器优化级别及其能力,这两者的行为可能非常不同,即使他们也在做同样的事情

如果你正在做一些随机访问,cpu L1缓存将开始错过页面,这将导致一些浪费的周期来拉/放一页。 如果L2能够服务于L1的错过,那么没关系 - 如果L2有一个未命中,那么在L2级别就会发生同样的情况......我想你得到了图片;)

更多: http://en.wikipedia.org/wiki/CPU_cache

你甚至可能造成数据危害,它的影响要小一些 - 但非常有趣 http://en.wikipedia.org/wiki/Hazard_%28computer_architecture%29#Data_hazards