int find(int a[], int x) for (int i = 0; i < |a|; i++) if a[i] == x return i return -1
int find(int a[], int x) l = 0 r = |a| while l < r m = (l + r)/2 if a[m] == x return m if a[m] ≤ x l = m + 1 else r = m return -1
int find(int a[], int x) for (int i = 0; i < |a|; i++) if a[i] == x return i return -1
array.length ==
n.
for (int i = 0; i < |a|; i++) : O(1) if a[i] == x : O(1) return i : O(1) return -1 : O(1)
for (O(1); O(1); O(1))) if O(1) : O(1) O(1) O(1)
for (O(1); O(1); O(1))) : O(1) O(1) O(1)
O(n) O(1)
l = 0 : O(1) r = |a| : O(1) while l < r : O(1) m = (l + r)/2 : O(1) if a[m] == x : O(1) return m : O(1) if a[m] ≤ x : O(1) l = m + 1 : O(1) else r = m : O(1) return -1 : O(1)
O(1) O(1) while O(1) O(1) if O(1) O(1) if O(1) O(1) else O(1) O(1)
|
O(1) O(1) while O(1) O(1) if O(1) : O(1) O(1) if O(1) O(1) else O(1) O(1)
|
O(1) O(1) while O(1) O(1) O(1) if O(1) : O(1) O(1) else O(1) O(1)
|
O(1) O(1) while O(1) O(1) : O(1) O(1) O(1) O(1)
while l < r m = (l + r)/2 if a[m] ≤ x l = m + 1 else r = m
O(1) O(1) while O(1) : O(log n) O(1) O(1)
O(1) O(1) O(log n) O(1)
|
class sequenceObject data [] int next-data append(T e) if next-data ≥ data.length() Object new-data [] = new Object [data.length() + 1] for i = 0 to data.length() - 1 new-data[i] = data[i] data = new-data data[next-data++] = e
sequence<Integer> is for i = 0 to 100 is.append(i)
if next-data ≥ data.length() : O(1) Object new-data [] = new Object [data.length() + 1] : O(1)?/O(n) for i = 0 to data.length() - 1 : O(1) new-data[i] = data[i] : O(1) data = new-data : O(1) data[next-data++] = e : O(1) if O(1) O(1) or O(n) for O(1) : O(n) O(1) O(1) or O(n) O(1)
if O(1) O(1) or O(n) O(n) O(1) or O(n) O(1)
|
if O(1) O(n) O(1)
|
O(n) O(1)
|
O(n)
|
sequence<Integer> is for i = 0 to 100 is.append(i)
How much work is going on here, worst case?
for i = 0 to n : O(1) is.append(i) : O(n)
append()
does O(n) work in the worst case.
for O(1) : O(n) O(n)
for i = 0 to n is.append(i)
append()
does work proportional to i
.
append()
is proportional to
1 + 2 + ... + n = n(n + 1)/2 = O(n2)
append()
have better behavior? How?
class sequenceObject data [] int next-data unsigned a = 50 append(T e) if next-data ≥ data.length() Object new-data [] = new Object [data.length() + a] for i = 0 to data.length() - 1 new-data[i] = data[i] data = new-data data[next-data++] = e
if next-data ≥ data.length() : O(1) Object new-data [] = new Object [data.length() + a] : O(n) for i = 0 to data.length() - 1 : O(1) new-data[i] = data[i] : O(1) data = new-data : O(1) data[next-data++] = e : O(1)
for i = 0 to n is.append(i)
with amortizing sequences.
append()
still does O(n) work on each
iteration, worst case.
for i = 0 to n is.append(i)
append()
does no work, or work proportional to
i
.
i
= ja, append()
does work proportional to ja.
append()
does work proportional to
0 + ... + a + ... + 2a + ... + ja = na(1 + 2 + ... + j) = aO(j) = O(j) = O(n)
|
|
append()
have asymptotically better behavior? How?
class sequenceObject data [] int next-data append(T e) if next-data ≥ data.length() Object new-data [] = new Object [data.length()*2] for i = 0 to data.length() - 1 new-data[i] = data[i] data = new-data data[next-data++] = e
for i = 0 to 100 is.append(i)
append()
does O(n) work in each iteration.
i
= 2j, append()
does work proportional to
2j, j a positive integer.
append()
does work proportional to
0 + 20 + 21 + 0 + 22 + ... + 2j, 2j = n
20 + 21 + ... + 2j = 2j + 1 - 1 = 2*2j - 1 = 2n - 1 = O(n).
This page last modified on 2 March 2010. |