数组
| 数组 | ||||
| 数组类型 |
不可重复 无序(线性查找) |
可重复(找到第一个即可) 无序(线性查找) |
不可重复 有序(二分查找) |
可重复(找到第一个即可) 有序(二分查找) |
| 插入 | O(N) |
O(1) |
O(logN+N) | O(logN+N) |
| 查询 | O(N) | O(N) | O(logN) | O(logN) |
| 删除(无洞) | O(N) | O(N) | O(lonN+N) | O(logN+N) |
| 总结 | 可重复无序插入快、下标已知更新查找快;查找删除慢、大小固定 | 查找快;插入删除慢、大小固定 | ||
| 应用 | 员工表,雇用解雇不经常发生 | |||
| java数组 | 无序、可重复;插入快、查询删除慢、大小固定;如果已知下标,更新查找快 | |||
| ArrayList | 大小可以扩展;但这是以牺牲效率为代价的 | |||
| Vector | 大小可以扩展;但这也是以牺牲效率为代价的 | |||
java 数组(无序、可重复)
已知下标查找更新快O(1)
String str = strs[1];
strs[1] = "花";
查找慢O(N)
int index = findChar("花", strs);
删除慢O(N)
deleteChar("花", strs);
中部插入慢O(N)
insertCharWithMiddle("兴", 1, strs);
大小固定
public static void main(String[] args) { String[] strs = {"中", "华", "人", "民", "共", "和", "国", null, null, null, null}; print(strs); // 已知下标查找更新快 System.out.println(strs[1]); strs[1] = "花"; print(strs); // 查找慢,需要花费O(N)的时间 int index = findChar("花", strs); if (index == strs.length) { System.out.println("Can't find this char"); } else { System.out.println("Find this char"); } // 删除慢,需要花费O(N)的时间 deleteChar("花", strs); print(strs); // 中部插入慢,需要花费O(N)的时间 insertCharWithMiddle("兴", 1, strs); print(strs); } private static void insertCharWithMiddle(String str, int index, String[] strs) { for (int i = strs.length - 2; i >= index; i--) { strs[i + 1] = strs[i]; } strs[index] = str; } private static void deleteChar(String str, String[] strs) { int index = findChar(str, strs); if (index != strs.length) { for (int i = index; i < strs.length - 2; i++) { strs[i] = strs[i + 1]; } strs[strs.length - 1] = null; } } public static int findChar(String str, String[] strs) { for (int i = 0; i < strs.length; i++) { if (strs[i].equals(str)) { return i; } } return strs.length; } public static void print(String[] strs) { System.out.println(Arrays.asList(strs)); }