这一个星期我学习了类与对象,倍增算法,前缀和以及STL的相关知识,接下来我会对其进行一个简单的总结:
首先是类与对象,类是一种用户自定义的数据结构类型,由数据成员以及成员函数组成;我们除了需要了解最基本的构造析构,拷贝构造以外;我个人认为有几个点是我在学习过程中需要强化记忆的:
1.数据成员可以是任意类型,但是不能用存储类型auto.register,extern修饰。
2.显式声明内联函数,格式为:
inline 返回类型 类名::成员函数名(参数表)
{ }
3.需要显式引用this指针的三种情况:
(1)在类的非静态成员函数中返回类对象本身或对象的引用时,用return *this;返回对象的地址时,return this;
(2)当参数与成员变量名相同时
(3)避免对同一对象进行赋值操作
4.必须使用参数初始化列表对数据成员进行初始化的三种情况:
(1)数据成员为常量
(2)数据成员为引用类型
(3)数据成员为没有无参构造函数的类的对象
这就是我认为的有关类的几个注意事项;
其次是前缀和,这个算法我感觉与高数中级数的和函数特别类似,Si = a0 + a1 + a2 + a3 + a4 +…+ ai。这个算法,我个人感觉它最巧妙的地方在于他大大降低了查询时间复杂度。原先如果要求一段区间的和,必须要对该区间的每个元素进行访问,整体的时间复杂度为O(n),而经过前缀和算法优化以后,时间复杂度只有O(1).
例如:
给定n个整数,然后进行m次询问,每次询问求一个区间内值的和。
如果用暴力写法,那每次询问都需要从区间左端点循环到区间右端点求和,时间复杂度较大。
这种时候就可以预先求出该数组的一维前缀和。
在最后就是关于倍增算法了,这个我就只记住了一点:只需要 log2(n) 的预处理,就能表示出[1,n]区间内的所有情况,即只要选择了1,2,4...2^i,就能表达出【1,2^(i+1)-1】的所有情况。
好了,这就是我近期学到的东西。