数据结构总结(2)
2016-02-25 15:35
435 查看
算法
{
算法的概念:
一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列
算法的对象:
数据
算法的特性:
(1)输入 有0个或多个输入
(2)输出 有一个或多个输出(处理结果)
(3)确定性 每步定义都是确切、无歧义
(4)有穷性 算法应在有穷性结束(避免死循环)
(5)有效性 每一条运算应足够基本
算法的评价:
(1)正确性
(2)可读性
(3)健壮性
*(4)高效性(时间代价和空间代价)
算法的效率衡量:
事后统计和事前分析估计
算法操作:
{
一般操作:
插入、删除、查找、遍历、交换、判断等
重要操作:
查找(查找方法)和排序
}
}
算法的时间复杂度
{
算法时间复杂度的概念
{
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:
T(n)=O(f(n))
}
算法时间复杂度的分类
{
线性阶(T( n ) = O ( 1)):
int a=1,b;b=a;
平方阶( T( n ) = O ( n 2)):
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
c[i][j] = a[i][j] + b[i][j];
语句的频度(Frequency Count ): 重复执行的次数:n*n;
立方阶(T( n ) = O ( n 3):
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{c[i][j]=0;
for(k=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
算法中的基本操作语句为c[i][j]=c[i][j]+a[i][k]*b[k][j];
对数阶(T(n) =O( log2n)):
i=1;
while(i<=n)
i=i*2;
即f(n)≤log2n,取最大值f(n)=log2n
所以该程序段的时间复杂度T(n) =O( log2n)
线性对数阶(T(n) =O(n log2n))
}
}
算法空间复杂度
{
算法的空间复杂度的概念
{
算法所需存储空间的度量,记作:
S(n)=O(f(n))
其中n为问题的规模(或大小)
}
算法要占据的空间:
(1)算法本身要占据的空间,输入/输出,指令,常数,变量等
(2)算法要使用的辅助空间
例子:
【算法1】 S(n) = O(1)
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t
}
【算法2】 S(n) = O(n)
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
、
}
{
算法的概念:
一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列
算法的对象:
数据
算法的特性:
(1)输入 有0个或多个输入
(2)输出 有一个或多个输出(处理结果)
(3)确定性 每步定义都是确切、无歧义
(4)有穷性 算法应在有穷性结束(避免死循环)
(5)有效性 每一条运算应足够基本
算法的评价:
(1)正确性
(2)可读性
(3)健壮性
*(4)高效性(时间代价和空间代价)
算法的效率衡量:
事后统计和事前分析估计
算法操作:
{
一般操作:
插入、删除、查找、遍历、交换、判断等
重要操作:
查找(查找方法)和排序
}
}
算法的时间复杂度
{
算法时间复杂度的概念
{
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:
T(n)=O(f(n))
}
算法时间复杂度的分类
{
线性阶(T( n ) = O ( 1)):
int a=1,b;b=a;
平方阶( T( n ) = O ( n 2)):
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
c[i][j] = a[i][j] + b[i][j];
语句的频度(Frequency Count ): 重复执行的次数:n*n;
立方阶(T( n ) = O ( n 3):
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{c[i][j]=0;
for(k=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
算法中的基本操作语句为c[i][j]=c[i][j]+a[i][k]*b[k][j];
对数阶(T(n) =O( log2n)):
i=1;
while(i<=n)
i=i*2;
即f(n)≤log2n,取最大值f(n)=log2n
所以该程序段的时间复杂度T(n) =O( log2n)
线性对数阶(T(n) =O(n log2n))
}
}
算法空间复杂度
{
算法的空间复杂度的概念
{
算法所需存储空间的度量,记作:
S(n)=O(f(n))
其中n为问题的规模(或大小)
}
算法要占据的空间:
(1)算法本身要占据的空间,输入/输出,指令,常数,变量等
(2)算法要使用的辅助空间
例子:
【算法1】 S(n) = O(1)
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t
}
【算法2】 S(n) = O(n)
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
、
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)