数据结构 设计高效算法问题 数据结构设计一个好的算法,应该达到什么目标?
\u6570\u636e\u7ed3\u6784:\u8bbe\u8ba1\u4e00\u4e2a\u9ad8\u6548\u7b97\u6cd5\uff0c\u5c06\u987a\u5e8f\u8868\u4e2d\u7684\u6240\u6709\u5143\u7d20\u9006\u7f6e\uff0c\u8981\u6c42\u7b97\u6cd5\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3aO(1)\u3002\u6570\u636e\u7ed3\u6784\u7684\u9ad8\u6548\u7b97\u6cd5\uff1afor(int i = 0; i < array.length / 2; i++) {swap(array[i], array[array.length - i - 1])}
\u53ea\u6709swap\u51fd\u6570\u9700\u8981\u4e00\u4e2a\u5b57\u8282\u7684\u5185\u5b58\uff0c\u6240\u4ee5\u7a7a\u95f4\u590d\u6742\u5ea6O\uff081\uff09\u3002
\u6570\u636e\u7ed3\u6784\u662f\u8ba1\u7b97\u673a\u5b58\u50a8\u3001\u7ec4\u7ec7\u6570\u636e\u7684\u65b9\u5f0f\u3002\u6570\u636e\u7ed3\u6784\u662f\u6307\u76f8\u4e92\u4e4b\u95f4\u5b58\u5728\u4e00\u79cd\u6216\u591a\u79cd\u7279\u5b9a\u5173\u7cfb\u7684\u6570\u636e\u5143\u7d20\u7684\u96c6\u5408\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u7cbe\u5fc3\u9009\u62e9\u7684\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u5e26\u6765\u66f4\u9ad8\u7684\u8fd0\u884c\u6216\u8005\u5b58\u50a8\u6548\u7387\u3002\u6570\u636e\u7ed3\u6784\u5f80\u5f80\u540c\u9ad8\u6548\u7684\u68c0\u7d22\u7b97\u6cd5\u548c\u7d22\u5f15\u6280\u672f\u6709\u5173\u3002
\u5bf9\u6bcf\u4e00\u4e2a\u6570\u636e\u7ed3\u6784\u800c\u8a00\uff0c\u5fc5\u5b9a\u5b58\u5728\u4e0e\u5b83\u5bc6\u5207\u76f8\u5173\u7684\u4e00\u7ec4\u64cd\u4f5c\u3002\u82e5\u64cd\u4f5c\u7684\u79cd\u7c7b\u548c\u6570\u76ee\u4e0d\u540c\uff0c\u5373\u4f7f\u903b\u8f91\u7ed3\u6784\u76f8\u540c\uff0c\u6570\u636e\u7ed3\u6784\u80fd\u8d77\u7684\u4f5c\u7528\u4e5f\u4e0d\u540c\u3002\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u5176\u64cd\u4f5c\u96c6\u4e0d\u540c\uff0c\u4f46\u4e0b\u5217\u64cd\u4f5c\u5fc5\u4e0d\u53ef\u7f3a:
1.\u7ed3\u6784\u7684\u751f\u6210;
2.\u7ed3\u6784\u7684\u9500\u6bc1;
3.\u5728\u7ed3\u6784\u4e2d\u67e5\u627e\u6ee1\u8db3\u89c4\u5b9a\u6761\u4ef6\u7684\u6570\u636e\u5143\u7d20;
4.\u5728\u7ed3\u6784\u4e2d\u63d2\u5165\u65b0\u7684\u6570\u636e\u5143\u7d20;
5.\u5220\u9664\u7ed3\u6784\u4e2d\u5df2\u7ecf\u5b58\u5728\u7684\u6570\u636e\u5143\u7d20;
6.\u904d\u5386\u3002
1\u3001\u6b63\u786e\u6027\uff0c\u9996\u5148\u4fdd\u8bc1\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u3002
2\u3001\u9ad8\u6548\u6027\uff0c\u8fd9\u6837\u80fd\u591f\u4fdd\u8bc1\u65f6\u95f4\u4e0a\u7684\u4f18\u52bf\u3002
3\u3001\u5bb9\u9519\u6027\u3001\u7a0b\u5e8f\u80fd\u59a5\u5584\u5904\u7406\u9519\u8bef\u7ec6\u8282\u3002
4\u3001\u53ef\u8bfb\u6027\u3001\u4fbf\u4e8e\u4ea4\u6d41\u561b
5\u3001\u7b80\u6d01\u884c\u3001\u5c3d\u91cf\u4e0d\u8981\u628a\u95ee\u9898\u590d\u6742\u5316\u3002
// 按常规思路,每删除一个顺序表元素,则要将其后的元素整体前移一个位置。这种算法用到了双重for循环,时间复杂度为O(n^2)。
// 以下的算法只用到了单重for循环,时间复杂度为O(n)。原理是把所有不在范围[x, y]内的元素依次保存到顺序表的前部,而不处理本来要删除的、在范围[x, y]内的元素。当把所有不需要删除的元素都保存到了顺序表前部,只需要重新设置一下顺序表的长度为“前部”的最大下标+1,就模拟了删除操作。
void fun(SqList *&L, ElemType x)
{
// i为循环计数器。
// j为不需要删除的元素个数,初始化为0。
int i, j = 0;
// 依次遍历顺序表的每个元素
for (i = 0; i < L->length; ++i)
{
// 只处理不需要删除的元素,即不属于区间[x, y]的元素
if (!(L->data[i] >= x && L->data[i] <= y))
{
// 每找到一个不需要删除的元素,就把该元素保存到下标j的位置。
L->data[j] = L->data[i];
// 随后令j自增1。之前j代表的是处理后的顺序表的最大下标,现在j代表的是处理后的顺序表的长度。由于下标从0开始,所以长度永远比最大下标大1。
++j;
}
}
// 设置顺序表的长度为j,这样以后遍历顺序表只能访问前j个元素。即使下标j之后可能还存在属于[x, y]的元素,但是不会访问到它们,自然相当于“删除”了。
L->length = j;
}
1、正确性,首先保证能够解决问题。2、高效性,这样能够保证时间上的优势。3、容错性、程序能妥善处理错误细节。4、可读性、便于交流嘛5、简洁行、尽量不要把问题复杂化。
扩展阅读:大数据含金量高的证书 ... 最高效的排序算法 ... 数据分析三大软件 ... 数据图表 ... 目前最快的排序算法 ... 常用的数据分析方法 ... 数据分析的常见工具 ... 数据分析的五种方法 ... 大量数据排序最快的算法是 ...