如果我有N x N 2维数组且名称是。
int a[N][N];
当我在任何数组中插入任何值时,例如a[N-1][N-1]=1
,需要多长时间?
O(N^2)
或O(1)
?
答案 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)
答案 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