Ruby 一起来写《基于 Ruby 的数据结构与算法》

chenge · 2014年05月04日 · 最后由 wujian_hit 回复于 2014年05月10日 · 6109 次阅读

不知道网上是否有基于 Ruby 代码的数据结构与算法的书籍,我觉得我们可以自己来编写,写出来可以供众多的学习者学习和参考。

希望未来更多的大学用 Ruby 来教这门核心基础课程,对推广 Ruby 也是大有益处的。

内容包括链表、堆栈、队列、树、图等。我先贴一个二叉树的,是老外写的。代码简洁易懂。


# https://zvkemp.github.io/blog/2014/04/25/binary-search-trees-in-ruby/

module BinaryTree
  class EmptyNode
    def to_a
      []
    end

    def include?(*)
      false
    end

    def push(*)
      false
    end
    alias_method :<<, :push

    def inspect
      "{}"
    end
  end

  class Node
    # our three features:
    attr_reader :value
    attr_accessor :left, :right

    def initialize(v)
      @value = v
      @left = EmptyNode.new
      @right = EmptyNode.new
    end

    def push(v)
      case value <=> v
      when 1 then push_left(v)
      when -1 then push_right(v)
      when 0 then false # the value is already present
      end
    end
    alias_method :<<, :push

    def include?(v)
      case value <=> v
      when 1 then left.include?(v)
      when -1 then right.include?(v)
      when 0 then true # the current node is equal to the value
      end
    end

    def inspect
      "{#{value}:#{left.inspect}|#{right.inspect}}"
    end

    def to_a
      left.to_a + [value] + right.to_a
    end

    private

      def push_left(v)
        left.push(v) or self.left = Node.new(v)
      end

      def push_right(v)
        right.push(v) or self.right = Node.new(v)
      end
  end
end

我觉得用哪种语言真心不是问题,毕竟 MIX 也足够了哦

#1 楼 @chunlea MIX 是什么意思

#2 楼 @chenge 计算机程序设计与艺术 中高德纳设计的汇编语言

#3 楼 @chunlea 大部分人都不会用汇编语言的。 #4 楼 @ruby_sky 谢谢推荐,很有价值,我抽空看看。

#5 楼 @chenge 我的意思是没必要纠结语言,重点在于算法的精髓,至于实现,只要知晓了算法的基本准则,任何语言都是可以的。

鼓励为上啊各位.....别出来一个拍死一个了...

#5 楼 @chenge 有空,一起研究研究?每个星期的周末?抽一个下午,一起研究研究?

#3 楼 @chunlea taocp 就像 teenage sex,大家都在谈论它,却几乎没人真的做过。

#9 楼 @rasefon 其实我更期待一本更简单的介绍各种算法的书籍,可能比单纯用 Ruby 实现一套更有价值。也就说重点应该在于算法,而不是 Ruby 实现。当然,个人拙见。期待成果。

匿名 #11 2014年05月04日

为嘛要有算法。。。。

#10 楼 @chunlea 常用的算法导论就有。

#13 楼 @allenfantasy 这个也不错,可以作为参考学习,他是从面试考虑,有些还比较复杂。 我想做的是比较基础的内容。

#10 楼 @chunlea 同意,重点是算法。不过是需要一门表达语言的,可以运行出结果,学起来就比较有兴趣。

其实我是主张教 lisp 的,打下函数思维的基础习惯。

@chenge 我拿 Scheme 写的,但基本上还是命令式的数据结构与算法的写法https://github.com/DeathKing/Hit-DataStructure-On-Scheme

我觉得完全没必要用 Ruby 写,而且如果没有对数据结构与算法本身还有 Ruby 本身有深厚了解,写出来的代码也不够 Rubyist。另外,用 Ruby 和用 C 没有太大的 本质上的不同,包括我上面用 Scheme 写的代码也是(打着“函数式”语言的旗号,但很多地方还是用 set! 来改变状态)。完成了这些代码后,我觉得特别是用 Scheme 来写命令式的数据结构有时候麻烦地要死。

有本 Pure Functional Data Structure,门槛有点高,不太适合(低年级)本科生。

#16 楼 @DeathKing 谢谢你的分享。 确实有些矛盾。也许可以变通一下,先学一门简单的 lisp 导论,讲一些简单的东西,只是学一些思维习惯。然后可以选择学 Ruby 或者,高级 lisp。

我感觉用 Ruby 写还是有必要,除非你认为 Ruby 将被淘汰,至少目前我认为不会淘汰,还很兴旺。

楼上好几位朋友说到算法不必要纠结特定的语言,但编程实现一种算法靠的就是特定语言啊。用不同的语言实现同一种算法,这时候就能表现出语言的魅力了。

# 发布这条状态同时也为测试一个偶然发现的bug。

我在做用纯 ruby 写一个全文检索系统,对 ruby 提供的数据结构和算法有一些研究。有一个 gem 是 google 的大神写的名字就叫 algorithms,用的 c/c++,ruby 封装,接口很棒。但是跟 STL 比起来还是逊色了一些。要写这样的工具,参考 STL 比较好。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号