上一页 1 2 3 4 5 6 7 ··· 15 下一页

2012年9月20日

时间复杂度O(n),空间复杂度O(1)的排序

摘要: 题目描述:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)解析:利用计数排序法,设置一大小为65536的int数组,范围a[0]~a[65535],并初始为0,然后遍历n个数,假设这n个数在数组array[0...n-1]中,则i取值从0到n-1同时执行a[array[i]]++,最后再依照顺序读数组a,遇到不为0时,将对应的下标读回数组array,计数是几次就读几次,覆盖原有数,这样得出的array即为排序所求因为空间复杂度大小已知,为65536,执行循环次数约为n+65536 ,所以其空间复杂度为O(n),空间复杂度O(1),代码略 阅读全文

posted @ 2012-09-20 10:09 as_ 阅读(4454) 评论(0) 推荐(0) 编辑

2012年9月19日

在移位数组中查找数

摘要: 题目描述:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。解析:很多解法的时间复杂度都停留在O(n),下面的解法 仍为二分查找法 只不过 对应题目做了相应的改进 时间复杂度为O(log2n)1.思路:(画图实际上更直观看出来思路,读者试着自己画出图来对应分析)设数组a[start]~a[end],mid = (start + end) / 2 在进行二叉查找时,待查找数肯定会在变量mid的两侧,其中mid的取值主要有以下几情况,第一种为a[mid] < a[start] 说明此时mid对应的数 阅读全文

posted @ 2012-09-19 16:13 as_ 阅读(933) 评论(0) 推荐(0) 编辑

和为n连续正数序列

摘要: 题目描述:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:来源于互联网 以下仅给出思路解法一:两个for循环解决,复杂度O(n2)解法二:因为整数序列有序,可以设立两个游标satrt,end,通过判区间[start,end]的和是否为n来得到这个序列。如果区间和大于n,start往前移动,如果小于n,end往前移动,等于就输出这个区间。时间复杂度是0(n).解法三:假设start + (start + 1) + ... +end = n 是一个答案,则根据求和公式就是 (start + 阅读全文

posted @ 2012-09-19 13:19 as_ 阅读(1138) 评论(0) 推荐(0) 编辑

2012年9月12日

C++ STL中的vector的内存分配与释放

摘要: 1.vector的内存增长vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。在调用push_back时,每次执行push_back操作,相 阅读全文

posted @ 2012-09-12 15:57 as_ 阅读(90955) 评论(10) 推荐(8) 编辑

2012年9月7日

Effective C++条款37:绝不重新定义继承而来的缺省参数值

摘要: 要点:绝对不要重新定义一个继承而来的缺省参数,因为缺省参数都是静态绑定,而virtual函数――你唯一应该覆写的东西――却是动态绑定。virtual函数是动态绑定的,而缺省参数却是静态绑定,对象的所谓静态类型,是它在程序中被声明时所采用的类型。class Shape { public: enum ShapeColor {Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; }; class Rectangle : public Shape { public: //赋予不同的缺省参数... 阅读全文

posted @ 2012-09-07 15:26 as_ 阅读(796) 评论(0) 推荐(0) 编辑

C/C++ struct/class/union内存对齐

摘要: struct/class/union内存对齐原则有四个:1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b 阅读全文

posted @ 2012-09-07 14:15 as_ 阅读(3346) 评论(0) 推荐(1) 编辑

C++之对象切割

摘要: 问题描述程序如下:#include <iostream>#include <cstdlib>using namespace std;class Base{ public: virtual void fun() { cout << "Base fun() is Called" << endl; }};class Derived:public Base{ public: void fun() { ... 阅读全文

posted @ 2012-09-07 13:07 as_ 阅读(2409) 评论(0) 推荐(0) 编辑

C语言的数组的地址

摘要: 问题描述:有如下程序:#include<stdio.h>int main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a + 1); printf("%d %d\n", *(a + 1), *(ptr-1)); return 0;}输出结果:2 5原因解释:*(a+1) 因为a的地址为数组a第一个元素的地址,所以a+1就是a的第二个元素的地址 输出为2&a的类型是int[5],则&a+1的偏移量为整个数组a的大小 换句话说它也表示了该数组最后一个元素的下一个地址,上面的ptr则是一 阅读全文

posted @ 2012-09-07 12:19 as_ 阅读(574) 评论(0) 推荐(1) 编辑

2012年9月2日

Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value

摘要: 要点:尽量以pass-by-reference-to-const替换pass-by-value,这通常比较高效,并可避免由子类对象拷贝成基类时的对象切割问题对于内值类型、STL迭代器和函数对象应该采用pass-by-value的形式。缺省情况下c++以by value 的方式传递对象(或来自)函数。函数参数是以实参的副本为初值,用函数获得的也是函数返回值的一个副本 这些副本由对象的copy构造函数产出,这可能使得pass-by-value成为昂贵的操作:class Person { public: Person(); virtual ~Person(); protected: ... 阅读全文

posted @ 2012-09-02 20:15 as_ 阅读(577) 评论(0) 推荐(0) 编辑

Effective C++条款9:绝不在构造和析构函数过程中调用virtual函数

摘要: 要点:不该在构造函数和析构函数期间调用virtual函数class Transaction //所有交易的基类 {public: Transaction(); virtual void logTransaction() const = 0;//做出一份因类型不同而不同 //的日志记录 }; Transaction::Transaction() //基类构造函数的实现 { l... 阅读全文

posted @ 2012-09-02 19:21 as_ 阅读(961) 评论(0) 推荐(0) 编辑

上一页 1 2 3 4 5 6 7 ··· 15 下一页

导航