没有官方统一定义
图书的摆放要使得2个相关操作方便实现:
方法1:随便放
操作1:新书怎么插入?
哪里有空放哪里,一步到位!
操作2:怎么找到某本指定的书?
…累死
方法2:按照书名的拼音字母顺序排放
操作2:怎么找到某本指定的书?
二分查找!
操作1:
新书怎么插入?
方法3:把书架划分成几块区域,每块区域指定摆放某种类别的书;在每种类别内,按照书名的拼音字母顺序排放
操作2:怎么找到某本指定的书?
先定类别,再二分查找
操作1:新书怎么插入?
先定类别,二分查找确定位置,移出空位
问题:空间怎么分配?类别应该分多细?
解决问题方法的效率,跟数据的组织方式有关
void PrintN(int N)
{
int i;
for(i=1; i<=N; i++){
printf("%d\n", i);
}
return;
}
void PrintN(int N)
{
if(N){
PrintN(N-1)
printf("%d\n", N)
}
return;
}
递归很容易爆掉
解决问题方法的效率,跟空间的利用效率有关
f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + a n x n f(x)=a_0+a_1x+...+a_{n-1}x^{n-1}+a_nx^n f(x)=a0+a1x+...+an−1xn−1+anxn
double f(int n, double a[], double x)
{
int i;
double p = a[0];
for(i=1; i<=m; i++)
p += (a[i] * pow(x, i));
return p;
}
秦九韶算法
f
(
x
)
=
a
0
+
x
(
a
1
+
x
(
.
.
.
(
a
n
−
1
+
x
a
n
)
.
.
.
)
)
f(x)=a_0+x(a_1+x(...(a_{n-1}+xa_n)...))
f(x)=a0+x(a1+x(...(an−1+xan)...))
double f(int n, double a[], double x)
{
int i;
double p = a[n];
for(i=n; i>0; i--)
p = a[i-1] + x*p;
return p;
}
clock()
:捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。
常数CLK_TCK
:机器时钟每秒所走的时钟打点数
#include
#include
clock_t start, stop;
/* clock_t是clock()函数返回的变量类型 */
double duration;
/* 记录被测函数运行的时间,以秒为单位 */
int main()
{
/* 不在测试范围内的准备工作写在clock()调用之前 */
start = clock(); // 开始计时
MyFunction(); // 把被测函数加在这里
stop = clock(); // 停止计时
duration = ((double)(stop-start))/CLK_TCK; // 计算运行时间
/* 其他不在测试范围内的处理写在后面,例如输出duration的值 */
return 0;
}
让被测函数
重复运行
多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次
运行的时间即可!
解决问题方法的效率,跟算法的巧妙程度有关
数据对象
在计算机中的组织方式
操作
相关联算法
逻辑结构:
- 把书架想象成一长条,除了一头一尾,一头挨着一头,一对一,线性结构
- 把图书分类,给每一类一个编号,一对多,
数
- 这些书都由什么人买过,这些人又买过什么书,多对多,
图
物理存储结构
- 逻辑结构在机器内存中怎么放,数组或者链表?
数据类型
抽象:描述数据类型的方法不依赖于具体实现
只描述数据对象集和相关操作集“是什么
”,并不涉及“如何做到
”的问题
void SelectionSort(int List[], int N)
{
*/ 将N个整数List[0]...List[N-1]进行非递减排序 */
for(i=0; i<N; i++)
MinPosition = ScanForMin(List, i, N-1);
/ *从List[i]到List[N-1]中找最小元,并将其位置赋给MinPosition */
Swap(List[i], List[MinPosition]);
/* 将未排序部分的最小元换到有序部分的最后位置 */
}
抽象 ——
List 到底是数组还是链表(虽然看上去很像数组)?
Swap 用函数还是用宏去实现?
void PrintN(int N)
{
if(N){
PrintN(N-1)
printf("%d\n", N)
}
return;
}
多项式分析
分析函数运行效率:机器运算加减法的效率比乘除法高很多,因此统计乘除法次数就好
在分析一般算法的效率时,我们经常关注下面两种复杂度
一个函数的上界和下界不是唯一的,它可以有很多个