自己备查:如何优化算法--缓存
2011-03-18 11:21
399 查看
题目:
http://projecteuler.net/index.php?section=problems&id=164
projecteuler.net #164
How many 20 digit numbers n (without any leading zero) exist such that no three consecutive digits of n have a sum greater than 9?
使用简单算法,从高位到低位便利每种组合,慢的要死
View Code class Problem164 : IProblem
{
Dictionary<int, C> last = new Dictionary<int, C>();
Dictionary<int, C> current = new Dictionary<int, C>();
public object Run()
{
int l, ll;
for (int i = 0; i < 100; i++)
{
l = i / 10;
ll = i % 10;
if (l + ll < 10)
last.Add(i, new C(l, ll, 1));
}
return Run2(2);
}
public long Run2(int level)
{
int thisLevelBegin = (level == 19 ? 1 : 0);
current = new Dictionary<int, C>();
int l, ll, sum, newNum;
long count;
foreach (KeyValuePair<int, C> p in last)
{
l = p.Value.L;
ll = p.Value.LL;
count = p.Value.count;
sum = p.Value.sum;
for (int i = thisLevelBegin, length = 10 - sum; i < length; i++)
{
newNum = i * 10 + l;
if (!current.ContainsKey(newNum))
{
current.Add(newNum, new C(i, l, count));
}
else
{
current[newNum].count += count;
}
}
}
if (level == 19)
{
count = 0;
foreach (KeyValuePair<int, C> p in current)
{
count += p.Value.count;
}
return count;
}
last = current;
return Run2(level + 1);
}
}
class C
{
public int LL;
public int L;
public int sum;
public long count;
public C(int l, int ll, long c)
{
LL = ll;
L = l;
count = c;
sum = l + ll;
}
}
http://projecteuler.net/index.php?section=problems&id=164
projecteuler.net #164
How many 20 digit numbers n (without any leading zero) exist such that no three consecutive digits of n have a sum greater than 9?
使用简单算法,从高位到低位便利每种组合,慢的要死
View Code class Problem164 : IProblem
{
Dictionary<int, C> last = new Dictionary<int, C>();
Dictionary<int, C> current = new Dictionary<int, C>();
public object Run()
{
int l, ll;
for (int i = 0; i < 100; i++)
{
l = i / 10;
ll = i % 10;
if (l + ll < 10)
last.Add(i, new C(l, ll, 1));
}
return Run2(2);
}
public long Run2(int level)
{
int thisLevelBegin = (level == 19 ? 1 : 0);
current = new Dictionary<int, C>();
int l, ll, sum, newNum;
long count;
foreach (KeyValuePair<int, C> p in last)
{
l = p.Value.L;
ll = p.Value.LL;
count = p.Value.count;
sum = p.Value.sum;
for (int i = thisLevelBegin, length = 10 - sum; i < length; i++)
{
newNum = i * 10 + l;
if (!current.ContainsKey(newNum))
{
current.Add(newNum, new C(i, l, count));
}
else
{
current[newNum].count += count;
}
}
}
if (level == 19)
{
count = 0;
foreach (KeyValuePair<int, C> p in current)
{
count += p.Value.count;
}
return count;
}
last = current;
return Run2(level + 1);
}
}
class C
{
public int LL;
public int L;
public int sum;
public long count;
public C(int l, int ll, long c)
{
LL = ll;
L = l;
count = c;
sum = l + ll;
}
}
相关文章推荐
- 本文主要分享自己在appstore项目中的性能调优点,包括同步改异步、缓存、Layout优化、数据库优化、算法优化、延迟执行等
- 【Tomcat】如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 算法优化,如何从120秒到0.5秒【数据结构的选择、数据类型的选择、运算优先级的选择、函数调用关系】
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 【转】如何在weka中加入自己的算法
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 如何利用客户端缓存对网站进行优化?
- 如何高质量优化自己网站提高排名?
- 如何利用客户端缓存对网站进行优化?
- 算法优化,如何从120秒到0.5秒【数据结构的选择、数据类型的选择、运算优先级的选择、函数调用关系】
- 如何利用客户端缓存对网站进行优化?
- 如何利用客户端缓存对网站进行优化?
- 如何利用客户端缓存对网站进行优化?
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 如何优化自己的网站
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)
- 算法优化,如何从120秒到0.5秒【数据结构的选择、数据类型的选择、运算优先级的选择、函数调用关系】
- 如何利用客户端缓存对网站进行优化?
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化