jjzjj

memoization

全部标签

java - 在 Brian Goetz 的 Java Concurrency In Practice 中,为什么 Memoizer 类没有使用 @ThreadSafe 注释?

BrianGoetz的JavaConcurrencyInPractice提供了一个用于并发使用的高效可伸缩缓存示例。该示例的最终版本显示了Memoizer类(第108页)的实现,显示了这样一个缓存。我想知道为什么这个类没有用@ThreadSafe注释?缓存的客户端类Factorizer已使用@ThreadSafe正确注释。附录指出,如果一个类未使用@ThreadSafe或@Immutable进行注释,则应假定它不是线程安全的。不过,Memoizer似乎是线程安全的。这是Memoizer的代码:publicclassMemoizerimplementsComputable{private

java - Java 中的 Haskell 风格内存

我知道这是异端邪说,但我试着翻译了来自http://www.haskell.org/haskellwiki/Memoization的例子到java。到目前为止,我有:publicabstractclassF{publicabstractBf(Aa);}...publicstaticFmemoize(finalFfn){returnnewF(){privatefinalMapmap=newHashMap();publicBf(Aa){Bb=map.get(a);if(b==null){b=fn.f(a);map.put(a,b);}returnb;}};}//usage:privatec

c++ - 记忆化递归 C++

我正在实现一个带内存的递归函数以提高速度。程序要点如下:我洗一副纸牌(红色和黑色的数量相等牌)并开始正面朝上发牌。在任何卡片之后你可以说“停止”,此时我付给你1美元每发出一张红牌,每发出一张黑牌,你就付给我1美元。你的最佳策略是什么,你愿意花多少钱玩这个游戏?我的递归函数如下:doubleGame::Value_of_game(doublenumber_of_red_cards,doublenumber_of_black_cards){doublevalue,key;if(number_of_red_cards==0){Card_values.insert(Card_values.be

c++ - C++ 中的内存仿函数包装器

这是我为函数编写的通用内存包装器。它利用tuplehash.templateclassmemofunc{typedefR(*func)(Args...);funcfun_;unordered_map,R,tuplehash::hash>>map_;public:memofunc(funcfu):fun_(fu){}Roperator()(Args&&...args){autokey=make_tuple(std::forward(args)...);autoq=map_.find(key);if(q==map_.end()){Rres=fun_(std::forward(args)..

c++ - 使用 memoized 函数观察到奇怪的性能

我正在研究使用欧几里德算法计算两个数的GCD的东西。我像往常一样实现了标准的单线,并且效果很好。它用于计算系列并调用gcd()的算法中每个元素多次,如n变大。我决定看看我是否可以通过内存来做得更好,所以这是我尝试过的:size_tconstgcd(size_tconsta,size_tconstb){returnb==0?a:gcd(b,a%b);}structmemoized_gcd:privatestd::unordered_map{size_tconstoperator()(size_tconsta,size_tconstb){unsignedlonglongconstkey=(

ios - Swift Memoization 调用语法说明

要实现递归函数的内存版本,需要将函数声明为非变异变量(根据WWDC2014-AdvancedSwift)。例如下面是斐波那契函数的实现:letfibonacci=memoize{(fibonacci:Int->Double,n:Int)inn谁能解释一下Swift中发生了什么?例如,在上面的代码片段中,Swift是如何知道fibonacci只接受一个参数的?编译器如何解决这个问题?我们凡人如何解决这个问题?语法表达式在编译器语法(NormalForm/CFG)中是什么样子的? 最佳答案 memoize函数的签名(从thatWWDCt

Swift 在结构中内存/缓存惰性变量

我喝了Swift中的struct/valuekoolaid。现在我有一个有趣的问题,我不知道如何解决。我有一个容器结构,例如structFoo{varbars:[Bar]}当我对此进行编辑时,我会创建副本以便保留撤消堆栈。到目前为止,一切都很好。就像好的教程所显示的那样。不过,我对这个人使用了一些派生属性:structFoo{varbars:[Bar]varderivedValue:Int{...}}在最近的分析中,我注意到a)计算derivedValue的计算有点昂贵/冗余b)在各种用例中并不总是需要计算。以我经典的OOP方式,我会将其设为内存/惰性变量。基本上,在调用之前让它为零,

java - 计算图: computing value ahead of time

我有一个computingmap(使用softvalues)我用来缓存昂贵计算的结果。现在我有一种情况,我知道在接下来的几秒钟内可能会查找特定的key。该key的计算成本也比大多数key都高。我想在一个最低优先级的线程中提前计算该值,以便在最终请求该值时它已经被缓存,从而缩短响应时间。这样做的好方法是:我可以控制执行计算的线程(特别是它的优先级)。避免了重复工作,即计算只进行一次。如果计算任务已经在运行,那么调用线程将等待该任务而不是再次计算值(FutureTask实现了这一点。对于Guava的计算映射,如果您只调用get但如果您将它与put的调用混合使用则不会。)“预先计算值”方法是

python - 超出最大递归深度,但仅在使用装饰器时

我正在编写一个程序来计算Python中的Levenshtein距离。我实现了记忆化,因为我递归地运行算法。我的原始函数在函数本身中实现了内存。这是它的样子:#MemoizationtablemappingfromatupleoftwostringstotheirLevenshteindistancedp={}#Levenshteindistancealgorithmdeflev(s,t):#Ifthestringsare0,returnlengthofotherifnots:returnlen(t)ifnott:returnlen(s)#Ifthelasttwocharactersar

python - 了解 python 内存装饰器中的参数处理

我一直在使用这个出色的装饰器来进行内存,这是我在网上找到的(此处以斐波那契数列为例):defmemoize(f):cache={}defmemf(*x):ifxnotincache:cache[x]=f(*x)returncache[x]returnmemf@memoizedeffib(n):ifn==1orn==0:return1returnfib(n-2)+fib(n-1)printfib(969)现在我想更好地了解内部工作原理,但我没有通过阅读Python中的装饰器或参数处理找到答案。为什么每次调用装饰函数时都没有重新初始化缓存字典?如何将*x识别为发送到修饰函数的参数,即函数调