这两天开始读Mark Allen的数据结构与算法设计,这些东西平时用到的机会少,看了久了就容易忘,为了巩固一下效果,争取隔段时间写点读书笔记,方便以后查阅。
第一章主要是简单回顾了一下数学基本知识,包括指数,对数,级数计算公式,还有证明方法,比如数学归纳法。
然后简单介绍了一下递归的定义,提出了四个递归的原则,分别如下:
- 基本情形,即不用递归就可以求解的情况。
- 向基本情况推进,每一次递归都必须使原来的问题更小化,更接近基本情形。
- 设计法则,假设所有的递归调用都可以正确执行。
- 合成效益法则,基本来说就是你在递归调用解决问题的时候,原问题会在过程中分解成很多子问题,子问题经过递归可以分解成更小的子问题,而在某些情况下,处于不同的递归树中的子问题可能会是相同的子问题,那么在设计算法的时候,应该避免多次求解同样的子问题,具体的例子可以参见斐波那契数列的最简单递归算法。
之后,因为该书是C++版本的,所以作者简单的回顾了一些C++的语法和概念,其中比较重要的,包括如下几个:
- 指针,参数的传递方式,比如值传递,引用传递,还有返回值的传递方式,也是值传递和引用传递
- 介绍了class,并且重点讲了三大成员方法,析构函数,复制构造函数,赋值操作符重载
- 最后说了些C++模板
鉴于我太久没有写C++代码了,很是生疏,于是写了点书中的template的例子,让自己回忆一下.
这里是SimpleTemplate.h文件
#ifndef _Simple_Template_H
#define _Simple_Template_H
// template class
template <typename T>
class SimpleTemplate
{
public:
// Use default parameter, initialize default parameter with T's zero parameter constructor
explicit SimpleTemplate( const T & initValue = T() ) : storedValue(initValue) {}
const T& Read() const { return storedValue; }
void Write( const T & value) { storedValue = value; }
private:
T storedValue;
}; // Don't forget this
#endif
这里是main.cpp文件
#include <iostream>
#include "SimpleTemplate.h"
#include <string>
#include <vector>
using namespace std;
// template method
template <typename T>
const T & FindMax( const vector<T> & sourceVector)
{
int maxIndex = 0;
for(int i=1; i < sourceVector.size(); ++i)
{
if( sourceVector[maxIndex] < sourceVector[i] )
{
maxIndex = i;
}
}
return sourceVector[maxIndex];
}
int main(char** argv, int argc)
{
SimpleTemplate<int> v1 = SimpleTemplate<int>(2);
SimpleTemplate<double> v2;
SimpleTemplate<string> v3;
cout << "V1=" << v1.Read() << endl;
cout << "V2=" << v2.Read() << endl;
cout << "V3=" << v3.Read() << endl;
v1.Write(5);
v2.Write(6.0);
v3.Write("hello");
cout << "V1=" << v1.Read() << endl;
cout << "V2=" << v2.Read() << endl;
cout << "V3=" << v3.Read() << endl;
vector<int> intList = vector<int>(5);
intList.push_back(2);
intList.push_back(1);
intList.push_back(3);
intList.push_back(10);
intList.push_back(9);
int maxValue = FindMax( intList);
cout << "MaxValue=" << maxValue << endl;
return 0;
}