有一种《围城》的感觉啊
#32 楼 @chrishine 也不能说没用,这是某种智力标记吧
#27 楼 @yaonie084 CS 的谁发 SCI 啊
学好计算机本科大一到大三该学的。。
看原文后面的评论吧。。
http://codeforces.com/blog/entry/10024#comment-154855
Hi!
Unfortunately, the Ruby implementation is not only very non-idiomatic in terms of code, but it does abuse the assignment operator to perform the exchange. This is why it is slower in the benchmarks. You'll find it performs way better if you take this into account.
Here's a pull request: https://github.com/MikeMirzayanov/binary-heap-benchmark/pull/10
In my testing, this version outperforms Python3 by a factor of 2. No clever tricks added.
#7 楼 @zj0713001 已经用上啦,的确很方便,就是每次 compile 之后 rails 会加上不同的 digest,那么七牛上以前的 assets 应该是还存在 bucket 里吧,这个小问题怎么处理比较方便呢?
@Vincent178 这个 gem 的 readme 写的 asset 缓存过期是怎么处理的呢,写的不是很清楚。谢谢!~
#56 楼 @nickelchen @blackanger 这个递归看上去比较好,但实际上复杂度是O(2^n)
的。
@shooter 的斐波那契的复杂度是 O(n)
的
实际上用矩阵乘法,复杂度是可以到 O(logn)
的
如下
require 'matrix'
def fab(n)
return 0 if n == 0
m = Matrix[[1, 1], [1, 0]]
mul([m] * n)[0, 1]
end
def mul(matrices)
return matrices[0] if matrices.size == 1
mid = matrices.size / 2
return mul(matrices[0, mid]) * mul(matrices[mid..-1])
end
(1..10).each { |n| puts fab(n) }
# 1
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# 34
# 55
def make_change(money, coins)
dp = [0]
path = []
result = {}
coins.each_with_index do |coin, index|
coin.upto(money) do |i|
if !dp[i - coin].nil? && (dp[i].nil? || dp[i - coin] + 1 < dp[i])
dp[i] = dp[i - coin] + 1
coins[index] += 1
path[i] = i - coin
end
end
end
if path[money].nil?
puts "impossible." and return
end
i = money
loop do
break if path[i].nil?
result[i - path[i]] ||= 0
result[i - path[i]] += 1
i = path[i]
end
p result # 具体解
puts dp[money] # 硬币数
end
这个和 @blackanger 的算法相同,多了记录具体解
第二个不是动规么
eval(STDIN.gets)
貌似现在可以了!
这门20年前开发的语言即使在现在的电脑上运行也依然能取得很高的性能。
什么毛线意思。。
就用 index 方法吧。。这种 builtin 的东西效率更可能得到优化,毕竟在代码量和效率上选择效率吧。
其实我觉得 ruby 是适合做 dsl 的,因此出现各种封装都不稀奇,但是最底层的才是有价值的东西吧。比如楼主写的代码算不算是 takewhile 在这个问题下的实现?如果是的话,那没啥好激动地,因为写实现的更伟大
#35 楼 @ery 当写算法的时候一定会用到数学的,至少算法的效能分析就是第一个门槛。算法的正确性证明是第二个门槛。所以不是写软件会不会用数学。而是写软件会用多复杂的算法,算法需要多复杂的数学。平时里大部分程序员解除到的工作是这样一个 IO,把现实世界的事物映射到计算机数据里,把食物的逻辑和规律映射到代码语句里,这里面能有非常多的数学吗?表面没有,因为数学不在表面,是人类抽象出来的。所以对于处理表面的东西大部分 coder 都能做了。 但绝逼有相当多的程序需要复杂的算法。系统级的程序是需要的,因为性能要快。大体说底层的都会或多或不少的涉及到,比如 ruby 解释器的实现云云。高级一些的工程也可能是会用到的,比如搜索引擎的算法等等。 所以讨论数学和计算机,还是去讨论算法吧,讨论纯技术性的东西,没有太大的意义。 结论就是,编一些涉及复杂算法的程序,(往往这些程序要想出来如何实现都比较困难),需要精深的数学。 平时做做 app 做做网站(看语气就知道我说的是哪种规模和强度的实践),不是特别需要,毕竟非计算机专业的人做计算机的太多了(因为计算机专业的人都得学离散,而别的不一定学,一定程度上可以区分会不会数学)