- 浏览: 1655968 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
night_stalker: http://www.iteye.com/topic/406220
Hooopo: http://www.iteye.com/topic/810957
两位大仙都讨论过Ruby Memoization
首先说一下什么是Memoization:
举个例子,fib数列:
递归调用,有很多重复的计算,如果我们能够将计算过的结果保存下来,下一次
需要计算的时候,直接出结果就ok了,这就是动态规划的思想。
于是乎:
我们使用一个@result数组来保存已经计算的结果,并且如果计算过直接返回。
||=是Ruby作为Lazy init和cache的惯用法。
但是对于false和nil的结果,由于||的特性,无效:
每次都的做出艰难的决定...
James 写了一个module,http://blog.grayproductions.net/articles/caching_and_memoization可以专门用作Memoization
代码类似如下:
使用这个模块,我们只需要include这个module,然后memoize :meth即可
可以使用
这样:
James的博客很不错:
http://blog.grayproductions.net/
false和nil还是不可以的。
有数组了,判断下has_key?就可以了吧?
false和nil还是不可以的。
Hooopo: http://www.iteye.com/topic/810957
两位大仙都讨论过Ruby Memoization
首先说一下什么是Memoization:
举个例子,fib数列:
def fib(n) return n if (0..1).include? n fib(n-1) + fib(n-2) end
递归调用,有很多重复的计算,如果我们能够将计算过的结果保存下来,下一次
需要计算的时候,直接出结果就ok了,这就是动态规划的思想。
于是乎:
def fib(n) @result ||= [] return n if (0..1).include? n @result[n] ||= fib(n-1) + fib(n-1) end
我们使用一个@result数组来保存已经计算的结果,并且如果计算过直接返回。
||=是Ruby作为Lazy init和cache的惯用法。
但是对于false和nil的结果,由于||的特性,无效:
def may_i_use_qq_when_i_have_installed_360? @result ||= begin puts "我们做出了一个艰难的决定..." false end end
每次都的做出艰难的决定...
James 写了一个module,http://blog.grayproductions.net/articles/caching_and_memoization可以专门用作Memoization
代码类似如下:
module Memoizable def memoize( name, cache = Hash.new ) original = "__unmemoized_#{name}__" ([Class, Module].include?(self.class) ? self : self.class).class_eval do alias_method original, name private original define_method(name) { |*args| cache[args] ||= send(original, *args) } end end end
使用这个模块,我们只需要include这个module,然后memoize :meth即可
include Memoizable def fib(n) return n if (0..1).include? n fib(n-1) + fib(n-2) end memoize :fib
可以使用
module Functional # # Return a new lambda that caches the results of this function and # only calls the function when new arguments are supplied. # def memoize cache = {} # An empty cache. The lambda captures this in its closure. lambda {|*args| # notice that the hash key is the entire array of arguments! unless cache.has_key?(args) # If no cached result for these args cache[args] = self[*args] # Compute and cache the result end cache[args] # Return result from cache } end # A (probably unnecessary) unary + operator for memoization # Mnemonic: the + operator means "improved" alias +@ memoize # cached_f = +f end class Proc; include Functional; end class Method; include Functional; end
这样:
factorial = lambda {|x| return 1 if x==0; x*factorial[x-1]; }.memoize # Or, using the unary operator syntax factorial = +lambda {|x| return 1 if x==0; x*factorial[x-1]; }
James的博客很不错:
http://blog.grayproductions.net/
评论
4 楼
fuliang
2010-12-01
恩,这样就ok了。
orcl_zhang 写道
3 楼
orcl_zhang
2010-11-29
fuliang 写道
orcl_zhang 写道
这样true和false也能Memoization。很好。转载下。
false和nil还是不可以的。
有数组了,判断下has_key?就可以了吧?
module Memoizable def memoize( name, cache = Hash.new ) original = "__unmemoized_#{name}__" ([Class, Module].include?(self.class) ? self : self.class).class_eval do alias_method original, name private original define_method(name) { |*args| cache.has_key?(args) ? cache[args] : cache[args] ||= send(original, *args) } end end end def may_i_use_qq_when_i_have_installed_360? @result ||= begin puts "我们做出了一个艰难的决定..." false end end cc = Hash.new include Memoizable memoize :may_i_use_qq_when_i_have_installed_360?,cc may_i_use_qq_when_i_have_installed_360? may_i_use_qq_when_i_have_installed_360? may_i_use_qq_when_i_have_installed_360? def fib(n) puts n return n if (0..1).include? n fib(n-1) + fib(n-2) end memoize :fib ,cc fib 10 fib 10 fib 10
irb(main):002:0> module Memoizable irb(main):003:1> def memoize( name, cache = Hash.new ) irb(main):004:2> original = "__unmemoized_#{name}__" irb(main):005:2> ([Class, Module].include?(self.class) ? self : self.class).class_eval do irb(main):006:3* alias_method original, name irb(main):007:3> private irb(main):008:3> original irb(main):009:3> define_method(name) { |*args| cache.has_key?(args) ? cache[args] : cache[args] ||= send(original, *args) } irb(main):010:3> end irb(main):011:2> end irb(main):012:1> end => nil irb(main):013:0> irb(main):014:0* def may_i_use_qq_when_i_have_installed_360? irb(main):015:1> @result ||= begin irb(main):016:2* puts "我们做出了一个艰难的决定..." irb(main):017:2> false irb(main):018:2> end irb(main):019:1> end => nil irb(main):020:0> irb(main):021:0* cc = Hash.new => {} irb(main):022:0> include Memoizable => Object irb(main):023:0> memoize :may_i_use_qq_when_i_have_installed_360?,cc => #<Proc:0xb7833db4@(irb):9> irb(main):024:0> irb(main):025:0* irb(main):026:0* may_i_use_qq_when_i_have_installed_360? 我们做出了一个艰难的决定... => false irb(main):027:0> may_i_use_qq_when_i_have_installed_360? => false irb(main):028:0> may_i_use_qq_when_i_have_installed_360? => false irb(main):029:0> irb(main):030:0* def fib(n) irb(main):031:1> puts n irb(main):032:1> return n if (0..1).include? n irb(main):033:1> fib(n-1) + fib(n-2) irb(main):034:1> end => nil irb(main):035:0> irb(main):036:0* memoize :fib ,cc => #<Proc:0xb7833db4@(irb):9> irb(main):037:0> irb(main):038:0* fib 10 10 9 8 7 6 5 4 3 2 1 0 => 55 irb(main):039:0> fib 10 => 55 irb(main):040:0> fib 10 => 55 irb(main):041:0> fib 10 => 55 irb(main):042:0> cc => {[4]=>3, []=>false, [10]=>55, [1]=>1, [7]=>13, [0]=>0, [6]=>8, [3]=>2, [9]=>34, [2]=>1, [8]=>21, [5]=>5}
2 楼
fuliang
2010-11-29
orcl_zhang 写道
这样true和false也能Memoization。很好。转载下。
false和nil还是不可以的。
1 楼
orcl_zhang
2010-11-28
这样true和false也能Memoization。很好。转载下。
发表评论
-
松本行弘的程序世界
2011-10-02 16:49 1399全书涉及到程序设计的方方面面,买这边书的目的希望能看到看看Ru ... -
Ruby HTTP/HTML parser相关资源
2011-09-28 12:04 1841Net::HTTP: http://ruby-doc.org ... -
命令行词典
2011-09-27 14:50 2025经常要查单词,所以利用qq dict api写了一个命令行词典 ... -
构建自己的DSL之三 抓取文件管理
2011-07-18 23:26 1750转载请标明出处:http://fuliang.iteye.co ... -
构建自己的DSL之二 抓取文本处理
2011-07-11 23:18 2299转载请标明出处:http://fuliang.iteye.co ... -
构建自己的DSL之一 Simple Crawler
2011-07-11 22:08 3016转载请标明出处:http://fuliang.iteye.co ... -
轻松删除所有安装的gem
2011-06-13 12:28 7982删除安装所有的gem: gem list | cut -d ... -
Ruby发送json请求
2011-05-05 18:37 5859require 'net/http' require ' ... -
写个简单的汉语bigram tokenizer
2011-01-23 23:29 1616写个简单的汉语bigram tokenizer,基本能够满足文 ... -
写段代码看看别人都怎么称呼你网站的?
2011-01-23 20:49 2168步骤很简单: 1)使用google的搜索inlink的语法li ... -
Ruby1.9 lambda操作符
2011-01-09 13:35 1393Ruby1.9提供了lambda操作符,使得lambda表达式 ... -
Ruby 1.9 regex (named capture group)
2011-01-08 22:57 2106Ruby 1.9正则增加了支持命名组,这样使得正则具有更好的可 ... -
Ruby Enumerators
2011-01-02 21:13 2351一个enumerator是一个用来枚举其他对象的Enumera ... -
Ruby Coroutine
2011-01-02 15:51 2751Ruby1.9提供了Fiber,提供了Coroutine的功能 ... -
Ruby Proc curry化
2011-01-01 23:11 1650Ruby 1.9 Proc增加了curry方法,可以将Proc ... -
Lazy evaluation in Ruby
2011-01-01 21:49 12321.使用||延迟初始化 def fib(n) ... -
One line Ruby code
2010-12-31 23:03 1226经常使用perl来代替一行的sed awk,主要是想使用per ... -
函数对象作为case语句中的条件
2010-12-31 22:28 1121Ruby 1.9的Proc#===作为call的一个别名,所以 ... -
从hash快速生成URL参数
2010-12-31 21:03 1961key_values = { :key1 => ... -
生成长度为n的随机字符串
2010-12-31 20:50 1650包含数字和小写字母的随机串 def gen_random_ ...
相关推荐
标题“yet another smooth scrolling”指的是一个Firefox浏览器的扩展插件,其主要功能是提供更平滑、更流畅的页面滚动体验。在描述中提到,这个插件的目标是为Firefox用户带来类似于Opera浏览器的平滑滚动效果,...
YSJSW,全称为"Yet Another Java Service Wrapper",是一个强大的工具,主要用于将Java应用程序转换为Windows服务。这个工具使得Java应用能够在Windows操作系统环境下无缝运行,就像原生的Windows服务一样,提供了...
《IntelliJ IDEA插件:Yet Another Emoji Support详解》 在现代编程环境中,代码注释、日志记录、甚至团队沟通中,表情符号(Emoji)的使用已经变得日益普遍,它们为文字信息增添了情感色彩,使得沟通更加生动有趣...
A free and easy-to-use REST Client. Use it to develop, test and debug RESTful services.
世界上最小的shell程序,有利于理解shell程序的基本原理。
PHP开发框架手册-Yaf(Yet Another Framework)用户手册.rar。PHP开发框架手册-Yaf(Yet Another Framework)用户手册.rar。PHP开发框架手册-Yaf(Yet Another Framework)用户手册.rar。PHP开发框架手册-Yaf(Yet Another ...
Yet Another Coldfusion CMS coldfusion 代码学习用哦
《Yet Another Haskell Tutorial》是一份详尽的指南,旨在为初学者提供全面的Haskell编程语言入门。Haskell是一种在编程领域中具有独特地位的语言,它被定义为一种懒惰的、纯函数式编程语言。这份教程由Hal Daume ...
在Pytorch平台上实现的Yet-Another-EfficientDet-Pytorch项目,为开发者提供了一种方便的工具,用于快速搭建和训练EfficientDet模型。 首先,我们来了解一下EfficientDet的核心设计。EfficientDet的核心是Efficient...
这个教程“Yet Scheme Another Tutorial”(YSAT)是为那些希望学习Scheme并准备参加SCIP(Scheme编程竞赛)的初学者精心编写的。本文将深入探讨Scheme的基础知识、核心特性以及在YSAT教程中可能涵盖的关键概念。 *...
Yet Another Scheme Tutorial——Scheme入门教程 中文版。其中文地址为:http://deathking.github.io/yast-cn/。pdf只是于2018。08把上面的内容加了目录、标题序号,制作成了pdf。 本教程的目的在于给读者在Scheme...
"Yet Another pattern recognition matlab toolbox.zip" 是一个专为模式识别设计的MATLAB工具箱,它包含了一系列函数和脚本,旨在帮助用户在MATLAB环境中进行模式识别和机器学习相关的研究与开发工作。这个工具箱...
[Unity3D] Yet Another Object Pooler YAOP是开发项目中使用的工具。它越小、越快越精简越好。如果需要,它可以动态缩小自身,减少程序内存使用。 安装和使用说明: 1. 下载包并导入。 2. 通过右键单击层次结构或...
`Yet-Another-EfficientDet-Pytorch-master`是一个基于Pytorch的EfficientDet实现,提供了7种不同规模的网络架构,适应不同的性能和资源需求。这些预训练模型包括从EfficientDet-D0到EfficientDet-D7,D0是最轻量级...
common, Yet another serial port debugger.
YASA(又一个主轴算法)是 Python 中的一个命令行睡眠分析工具箱。YASA的主要功能是: 多导睡眠图数据的自动睡眠分期(参见预印本文章)。 事件检测:单通道或多通道 EEG 数据上的睡眠纺锤波、慢波和快速眼球运动。...
【标题】:“Yet another Facebook clone written in C.zip” 这个标题暗示了一个项目,它是一个使用C语言编写的Facebook的复制品,或者可以说是一个社交网络平台的克隆版。在IT行业中,"Yet another" 这样的表达...
全新的BT客户端ABC [Yet Another Bittorrent Client>,开一个可以下载多个BT,相信很多人已经找了好久,但是一直没有满意的吧?ABC是一个非常棒的单窗口BT客户端。稳定,占内存非常小,速度快!新版修正一个Shad0w...
文件名:YAPP - Yet Another Prefab Painter v1.6.0.unitypackage YAPP - Yet Another Prefab Painter 是一款专为 Unity 开发者设计的工具,旨在简化和加速在场景中批量放置和绘制 Prefab(预制体)的过程。通过...
用C#编写的图形化资源管理器程序,用于浏览BACnet设备(在Windows和Linux上运行)。 当前同时支持BACnet IPv4,IPv6 + BACnet MSTP + BACnet PTP + BACnet以太网。 用于读取,写入,读取多个,写入多个,iam,whois...