摘要: 问题:给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。解法一:最直接的方法就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,就得到了问题的解。1 int CountOne(int N){2 int num=0;3 while(N){4 num+=((N%10==1)?1:0);5 N/=10;6 }7 return num;8 }此方法简单,容易理解,但它的问题是效率,时间复杂度为O(N * lgN),N比较大的时候,需要耗费很长的时间。解法二:归纳法寻找N... 阅读全文
posted @ 2013-03-29 16:26 放空自己 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 直接的方法是对所有的id进行排序,然后在扫描一遍ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过一半,那么就输出这个ID这个算法的时间复杂度是O(N*logN+N)。如果ID列表有序,则不需要扫描列表。如果一ID出现的次数超过总数的一半。那么无论水王的ID是什么,这个有序表的第N/2项 一定会是这个ID以上两种方法都是先对ID列表进行排序,时间复杂度没有根本改进,能否避免排序?如果每次删除两个不同的ID,那么,在剩下的列表中,水王ID出现的次数仍然超过总数的一半。总的时间复杂度是O(N)。int Find(int *ID,int N){//每次删除两个不同的id int c... 阅读全文
posted @ 2013-03-29 10:58 放空自己 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 问题:1,求N!末尾有多少个0? 2,N!的二进制表示中最低位1的位置?问题1的解法一:如果N!= K×10M,且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^x)×(3^y)×(5^z)…,由于10 = 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X, Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。问题相当于求N!中有质因数5的个数。解法二:Z=[N/5]+[N/5^2]+[N/5^3]……int NumberOfFi 阅读全文
posted @ 2013-03-29 09:41 放空自己 阅读(182) 评论(0) 推荐(0) 编辑
摘要: #include<iostream>using namespace std;int count1(int a);int count2(int N);int count3(int N);int main(){ cout<<"二进制数中1的个数是:"<<count1(32)<<endl; cout<<"二进制数中1的个数是:"<<count2(18)<<endl; cout<<"二进制数中1的个数是:"<<count3(32)< 阅读全文
posted @ 2013-03-27 20:49 放空自己 阅读(190) 评论(0) 推荐(0) 编辑
摘要: _tmain()是为了支持unicode所使用的main一个别名,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么两行#include <stdio.h>#include <tchar.h>我们可以在头文件<tchar.h>里找到_tmain的宏定义 #define _tmain main所以,经过预编译以后, _tmain就变成main了main()是标准C++的函数入口。标准C++的程序入口点函数,默认字符编码格式ANSI函数签名为:int main();int main(int argc, ch 阅读全文
posted @ 2013-03-05 11:52 放空自己 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 随机梯度下降法stochastic gradient descent,也叫增量梯度下降由于梯度下降法收敛速度慢,而随机梯度下降法会快很多–根据某个单独样例的误差增量计算权值更新,得到近似的梯度下降搜索(随机取一个样例)–可以看作为每个单独的训练样例定义不同的误差函数–在迭代所有训练样例时,这些权值更新的序列给出了对于原来误差函数的梯度下降的一个合理近似–通过使下降速率的值足够小,可以使随机梯度下降以任意程度接近于真实梯度下降•标准梯度下降和随机梯度下降之间的关键区别–标准梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查某个训练样例来更新的–在标准梯度下降中,权值更新的每 阅读全文
posted @ 2013-03-05 10:19 放空自己 阅读(611) 评论(0) 推荐(0) 编辑
摘要: 标准库<cstdlib>(被包含于<iostream>)提供两个生成伪随机数的函数。函数一:int rand(void);// 整数型 取随机数()从srand()中指定的seed开始,返回一个[seed,RAND_MAX(0x7fff)]间的随机整数函数二:void srand(unsigned seed);//置随机数种子参数seed是rand()的种子,用于初始化rand()的起始值。rand()调用步骤:(1)若有srand(seed) ,seed是一个定值时,rand()产生的值都会一样;seed不是定值每次程序运行rand()产生的值不一样。(2)没有 会自 阅读全文
posted @ 2013-03-02 20:33 放空自己 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 1.插入排序插入算法的设计使用的是增量方法:在排好序的数组A[1..j-1]后,将元素A[j]插入,形成排序好的子数组A[1..j],不满足的元素往后平移。插入排序的效率是O(n^2)c++实现:void insertsort(int *a,int length){ int key,i,j; for(j=1;j<length;++j){ key=a[j]; i=j-1; while(i>=0&&a[i]>key){ a[i+1]=a[i]; --i; } a[i+1]=key; }}2,分治法-合并排序分治策略基本思想:将原问题划分成n个规模较小而结构与原问题 阅读全文
posted @ 2013-02-28 21:04 放空自己 阅读(176) 评论(0) 推荐(0) 编辑