算法设计与分析课程记录week1
PS:此文章仅作为个人课程期间的学习记录
文章目录
0.概述
推荐教材:《算法设计与分析》(第2版)李春葆等编著
推荐书籍:《算法导论》,《编程之美》,《编程珠玑》
推荐网课:
厦门大学算法设计与分析
北京大学算法设计与分析
推荐软件:
Visual Studio Code,Dev C++,CodeBlocks
1.算法的概念
算法需具备的五个基本要素:
好的算法的五个特性:
2.C++的一些基础知识
引用
在C语言中调用函数时只有从实参到形参的单向值传递,执行函数时若改变了形参而对应的实参不会同步改变。 为此C++语言中增加了引用型参数的概念,引用型参数名前需加上“&”,表示这样的形参在执行后会将结果回传给对应的实参。
结论:在设计算法时,如果某个形参需要将执行结果回传给实参,需要将该形参设计为引用型参数。
模板
- 类模板:使用泛型参数的类
- 函数模板:使用泛型参数的函数
示例代码
#include<iostream>
using namespace std;
template <typename T>T Max(T a,T b)
{
return (a>b)?a:b;
}
int main()
{
cout<<Max(4,3)<<endl;
cout<<Max(13.77,13.76)<<endl;
cout<<Max('A','Y')<<endl;
system("pause");
return 0;
}
输出结果:
4
13.77
Y
注意事项
3.STL
标准模板库(Standard Template Library,STL):是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
- 容器(Container) :一种数据结构,以模板类的方法提供。常用的容器有:List,Vector,Dequnes,Set和Map等。
- 算法(Algorithm) :STL提供了大约100个实现算法的模版函数,常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
- 迭代器(Iterator) :类似于一个伪指针,提供了访问容器中对象的方法。
- 仿函数(Functor)
- 适配器(Adaptor)
- 分配器(Allocator)
常见容器
1. Vector
. vector翻译为向量,但使用”变长数组“更容易理解,如果要使用vector,则需要添加vector头文件,即#include<vector>.
//Arrayname[0]~Arrayname[arrSize-1]中的每一个都是一个Vector容器
vector<typename>Arrayname[arraySize]
//这种vector数组课当作两个维都是可编程的二维数组理解
vector<vector<int>> name
示例代码
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//array用来保存一个3*3的二维数组,array的每个元素都是vector<int>类型
vector <vector<int> >array;
std::vector<int> v;
for (int i = 0; i <3; i++){
for (int j = 0; j <3; j++){
int value;
cin >> value;
v.push_back(value);
}
array.push_back(v); //保存array的每个元素
v.clear();
}
for (int i = 0; i <array.size(); i++)
{
for (int j = 0; j <3; j++)
cout <<array[i][j] <<" ";
cout<<endl;
}
return 0;
}
输入3*3的矩阵,输出如下:
vector的访问方式有两种,分别是通过下标访问或者通过迭代器访问。
-
通过下标访问
上面的代码就是通过下标访问的 -
通过迭代器访问
int main()
{
vector<int> vi;
unsigned seed = time(0);//通过种子生成随机数
srand(seed);
for (int i = 1; i <= 5; i++)//存入5个随机数
{
int val = rand();
vi.push_back(val);
}
//vi.begin()为取vi的首元素地址,而it指向它
vector<int>::iterator it = vi.begin();
for (int i = 0; i <5; i++)
{
printf("%d ",*(it+i));
}
system("pause");
return 0;
}
根据上述两段代码可以看出:vi[i]
和*(vi.begin()+i)
是等价的。
注意事项
vector常用函数
- push_back()
push_back(x)就是在vector后面添加一个元素x。 - pop_back()
相反地,pop_back()就是删除vector的尾元素。 - size()
size()用来获得vector中的元素个数,返回的是unsigned类型。 - clear()
clear()用于清空vector中的所有元素,时间复杂度为O(N)。 - insert()
insert(it,x)用来想vector的任意迭代器it插入一个元素x,时间复杂度也为O(N)。 - erase()
erase()有两种用法,删除单个元素及删除一个区间内的所有元素,时间复杂度均为O(N)。
erase(it):删除迭代器it处的元素
erase(first,last):删除[first,last)内的所有元素,即以first为头,last前一个位置为尾。
未完待续