Considere el desarrollo de una aplicación que contemple la creación de Matrices. Se ha de utilizar una representación para matrices densas y otra diferente para matrices dispersas.
Una matriz se considerará dispersa si tiene más de un 60% de ceros. Se ha de establecer una relación de herencia entre las clases que se utilicen para su representación. Las operaciones básicas con matrices son diferentes en cada caso.
test/tc_ordenacion.rb. Véase Test/Unit 16.1
spec/ordenacion_spec.rb. Véase Test Driven Development (TDD) y Rspec 17
travis. Véase Integración Contínua: Travis 20
y
Custom Bundler arguments and Gemfile locations 20.1
guard. Véase Guard 21
Sugerencias:
[~/srcLPPruby/matrices_dispersas]$ cat sparse_matrix.rb
require 'pp'
class SparseVector
attr_reader :vector
def initialize(h = {})
@vector = Hash.new(0)
@vector = @vector.merge!(h)
end
def [](i)
@vector[i]
end
def to_s
@vector.to_s
end
end
class SparseMatrix
attr_reader :matrix
def initialize(h = {})
@matrix = Hash.new({})
for k in h.keys do
@matrix[k] = if h[k].is_a? SparseVector
h[k]
else
@matrix[k] = SparseVector.new(h[k])
end
end
end
def [](i)
@matrix[i]
end
def col(j)
c = {}
for r in @matrix.keys do
c[r] = @matrix[r].vector[j] if @matrix[r].vector.keys.include? j
end
SparseVector.new c
end
end
if __FILE__ == $0
z = SparseMatrix.new 1000 => { 100 => 1, 500 => 200}, 20000 => { 1000 => 3, 9000 => 200}
puts "z[1000] = #{z[1000]}"
puts "z[1000][1] = #{z[1000][1]}"
puts "z[1000][500] = #{z[1000][500]}"
puts "z.col(500) = #{z.col(500)}"
puts "z.col(4000) = #{z.col(4000)}"
[~/srcLPPruby/matrices_dispersas]$ ruby sparse_matrix.rb
z[1000] = {100=>1, 500=>200}
z[1000][1] = 0
z[1000][500] = 200
z.col(500) = {1000=>200}
z.col(4000) = {}
Casiano Rodriguez León 2015-01-07