在本科的时候就学过数据结构,那时候用的是清华大学C++版本的教材。上研究生之后,在实际学习与工程中愈发发觉数据结构的重要性,所以重新进行了数据结构的再学习,采用了清华大学邓俊辉副教授的视频课程,同时在学习中整理笔记如下。
1、绪论
- (a)计算
两个重要方面: 正确性:算法功能与问题要求一致?数学证明?
成本:运行时间,所需存储空间 如何度量,如何比较?
进行归纳概括:划分等价类 观察:问题实例的规模
特定算法+不同实例
在规模同为n的所有实例中,只关注最坏(成本最高)者
对象:规律、技巧
目标:高效,低耗
- (b)计算模型 定义一个公共的、理想的尺子
算法,在特定计算模型下,旨在解决特定问题的指令序列:输入、输出、正确性、确定性、可行性、有穷性
Hailstone序列(对有穷性的讨论)
// HailStone.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
int hailstone(long n)
{
int length=1;
while (1<n)
{
n=(n%2)?n*3+1:n/2;
length++;
}
return length;
}
int _tmain(int argc, _TCHAR* argv[])
{
long n;
cin>>n;
int length = hailstone(n);
cout<<length ;
system("pause");
return -1;
}
输入:7 输出:17
输入:27 输出:112
有穷性不确定,所以该程序未必是一个算法,程序≠算法
算法:如何设计、优化?
什么是一个好的算法?
正确:能够从正确处理各种输入
健壮:能够辨别不合法的输并做适当处理
可读:结构化+命名准确+注释+……
效率:速度尽可能快,存储空间尽可能少
- (c)大O记号
渐进分析,当n>>2后,对于规模为n的输入,算法T(n),S(n)(通常不关心)
大O记号
常系数可忽略
低次项可忽略
其它记号:大Ω 大Θ
O(1) 常数复杂度