影响程序运行的总时间主要和两点有关
前者主要取决于计算机性能、编译器、操作系统;
后者主要取决于程序本身和输入。
大O表示法:描述算法的运行时间和数据结构规模的关系
O(1) O(n) O(log n) O(n log n) O(n^2)
例子:数组末尾添加,四条语句执行时间,O(1)
public void Insert(int index, T item) { if (index < 0 || index > count) { throw new ArgumentException("数组索引越界"); } if (count == data.Length) { ResetCapacity(2 * data.Length); } for (int i = count - 1; i >= index; i--) { data[i + 1] = data[i]; } data[index] = item; count++; } public void AddLast(T item) { Insert(count, item); }
|
数组头部添加,4+n条语句执行,O(n)
public void Insert(int index, T item) { if (index < 0 || index > count) { throw new ArgumentException("数组索引越界"); } if (count == data.Length) { ResetCapacity(2 * data.Length); } for (int i = count - 1; i >= index; i--) { data[i + 1] = data[i]; } data[index] = item; count++; }
public void AddFirst(T item) { Insert(0, item); }
|
数组根据值找索引 O(1)或者O(n)
public int IndexOf(T value) { for (int i = 0; i < count; i++) { if (data[i].Equals(value)) { return i; } } return -1; }
|
- 元素存在数组中
- 元素在数组头部找到:O(1)
- 元素在数组尾部找到:O(n)
- 平均在数组中间找到:O(2/n)=O(n)
- 元素不在数组中:O(n)
数组末尾删除,O(1)
public T Delete(int index) { if (count == data.Length / 4) { ResetCapacity(data.Length / 2); } if (index < 0 || index >= count) { throw new ArgumentException("索引超出数组界限"); } T temp = data[index]; for (int i = index + 1; i < count; i++) { data[i - 1] = data[i]; } count--; data[count] = default(T); return temp; }
public T RemoveLast() { return Delete(count - 1); }
|