搜索算法的剪枝优化(Google笔试题)
来源:互联网 发布:思学通软件怎么样 编辑:程序博客网 时间:2024/05/21 03:58
这个题目的英文原题是:
Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n.
For example, f(13)=6. Notice that f(1)=1. What is the next largest n such that f(n)=n?
翻译过来大体是这样:
有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?
为什么f(13)=6, 因为1,2,3,4,5,6,7,8,9,10,11,12,13.数数1的个数,正好是6.
---------------------------------------------------------------------------------------------------------------------------------
我的算法实现import java.util.HashMap;
import java.util.Map;
/**
* @author Kevin
*/
public class CalculateNumberOfOnes {
//存储已经检查过的符合条件的f(n)
static Map treeNodeOKcache = new HashMap();
private int currentSize = 0;
//private int maxValue = Integer.MAX_VALUE;//2147483647
private int maxTestValue = 40000000;
public void getNextNum(int n){
n = n<=1?1:n ;
/*
* 说明当前没有计算过
*/
if(0 == currentSize){
//f(1) = 1
currentSize = 1;
treeNodeOKcache.put(String.valueOf(1),String.valueOf(1));
}
/*
* f(n+1) = f(n) + fs(n+1);
* 计算本次fs(n+1)的结果
*/
for(int i=2;i<maxTestValue;i++){
currentSize += countOneNumber(i);
if(currentSize == i){
treeNodeOKcache.put(String.valueOf(i),String.valueOf(currentSize));
}
}
}
public int countOneNumber(int n){
int count = 0;
while ( n > 0 ){
//模除10
int mod = n%10;
if ( mod == 1 )
count++;
n = n/10;
}
return count;
}
public static void main(String[] args){
CalculateNumberOfOnes instance = new CalculateNumberOfOnes();
long start = System.currentTimeMillis();
instance.getNextNum(0);
System.out.println("satisfy condition num is ="+treeNodeOKcache.size());
System.out.println(" total spent "+(System.currentTimeMillis()-start)+"ms used!");
}
}
结果:satisfy condition num is =40 total spent 12797ms used!
此题主要不是计算某一个f(n),而是利用f(n+1) = f(n) + fs(n+1) ;单算某一个数n效率很低,但是从0算到n时间的话速度就快了。再加上跳跃,还能更快。真正在降低计算时间上作用巨大的是剪枝,也就是说如果把那么多数字看作一棵搜索树上的节点的话,如何知道哪些分支子树是不用去检查判断的,否则无论怎么做也快不起来。
----------------------------------------------------------------------------------------------------------------------
剪枝算法参考文章:
1、http://noi.gnzx.gd.cn/html/2004-11/105.htm
2、http://cai.csu.edu.cn/jpkc/rengongzhineng/rengongzhineng/kejian/AI/Ai/chapter3/333.htm
- 搜索算法的剪枝优化(Google笔试题)
- 搜索算法的剪枝优化
- 谈搜索算法的剪枝优化(转载)
- 搜索的优化算法——剪枝
- 谈搜索算法的剪枝优化
- 搜索的优化算法——剪枝
- 搜索 和优化剪枝
- 剪枝算法(算法优化)
- 搜索算法-搜索的优化
- 搜索方法中的剪枝优化
- 搜索中的剪枝算法小议
- 搜索时的剪枝
- 搜索算法--线性搜索、二分搜索、内插搜索、剪枝搜索
- 优化google搜索
- Sticks ---- 深度优先搜索+剪枝优化
- 基于深度优先搜索的回溯算法(递归剪枝及奇偶性剪枝好题!):HDOJ 1010 - Tempter of the Bone
- UOJ#9 浅谈在线仙人球嵌套动态网络路径剖分优化的分支定界贪心剪枝启发式迭代加深人工智能搜索决策算法解决问题
- 从一道笔试题谈算法的优化(上)
- Oracle不同版本间的导入导出命令详解
- 无语了
- 热烈祝贺大家获得好成绩!
- Linux下c开发 之 线程通信(转)
- Ruby取得指定月日期数的方法
- 搜索算法的剪枝优化(Google笔试题)
- Ajax
- Javascript中将输入的数字转化成货币格式
- 小试 ZK
- OpenSolaris 2009 内测试用手记
- 关于安装windows2008后登录的问题
- C#实现将一个类序列化存储在数据库中
- Java 中的堆和栈
- 5级下拉框不刷新联动