SORU
4 Ocak 2009, Pazar


Ruby bir dizin karma bir diziye dönüştürmek

Bir dizi var, ve hızlı bir şekilde soracağım bir karma yapmak istiyorum "X dizisi mi?".

Perl, bunu yapmak için (ve hızlı) kolay bir yolu var:

my @array = qw( 1 2 3 );
my %hash;
@hash{@array} = undef;

Bu gibi görünen bir karma oluşturur:

{
    1 => undef,
    2 => undef,
    3 => undef,
}

Ruby ile geldim en iyisidir:

array = [1, 2, 3]
hash = Hash[array.map {|x| [x, nil]}]

hangi verir:

{1=>nil, 2=>nil, 3=>nil}

Ruby daha iyi bir yolu var mı?

1 DÜZENLEYİN

Hayır, Dizi.vardır? iyi bir fikir değil. Onunyavaş. O(1) yerine O bir sorgu(n) yapar. Örnek benim dizisi kısa olması için üç unsur vardı; varsayalım gerçek bir milyon öğeler vardır. Hadi küçük bir kıyaslama yapın:

#!/usr/bin/ruby -w
require 'benchmark'

array = (1..1_000_000).to_a
hash = Hash[array.map {|x| [x, nil]}]

Benchmark.bm(15) do |x|
    x.report("Array.include?") { 1000.times { array.include?(500_000) } }
    x.report("Hash.include?") { 1000.times { hash.include?(500_000) } }
end

Üretir:

                     user     system      total        real
Array.include?  46.190000   0.160000  46.350000 ( 46.593477)
Hash.include?    0.000000   0.000000   0.000000 (  0.000523)

CEVAP
4 Ocak 2009, Pazar


Eğer üyelik için karma gerekiyorsa, Set bir kullanmayı düşünün:

Ayarlayın

Set ile sırasız değerler topluluğu uygular çoğaltır. Bu Dizi ınter-operasyon sezgisel bir melez. tesisleri ve Karma hızlı arama.

Set Enumerable nesnelerle kullanımı kolay (uygulama * *2). En başlatıcı yöntemleri ve ikili operatörler kabul kümeler ve diziler ayrıca Enumerable genel nesneler. Bir Enumerable nesne Set kullanarak dönüştürülebilir to_set yöntem.

Set aşağıdaki noktaları dikkate almanız gerekir yani depolama olarak Karma kullanır:

  • Elementlerin eşitlik Object#eql? Object#hash göre belirlenir.
  • Set her elementin kimliğini saklı olsa da değişmez olduğunu varsayar. Değiştirme bir dizi unsuru bir set işlerler değiştirme güvenilmez devlet.
  • Bir dize depolanan olduğunda, dize dondurulmuş bir kopyasını özgün dize zaten donmuş olduğu sürece yerine saklanır.

Karşılaştırma

Karşılaştırma<, >, <= ve >= olarak uygulanır operatörleri steno {proper_,}{alt sanıyorsunuz?üst?} yöntemleri. Ancak, 10 ** operatör kasıtlı olarak her çifti çünkü dışarı bırakılır ayarlar karşılaştırılabilir. ({x,y} örneğin vs {x,z})

Örnek

require 'set'
s1 = Set.new [1, 2]                   # -> #<Set: {1, 2}>
s2 = [1, 2].to_set                    # -> #<Set: {1, 2}>
s1 == s2                              # -> true
s1.add("foo")                         # -> #<Set: {1, 2, "foo"}>
s1.merge([2, 6])                      # -> #<Set: {1, 2, "foo", 6}>
s1.subset? s2                         # -> false
s2.subset? s1                         # -> true

[...]

Genel Sınıf Yöntemleri

yeni(numaralama = nil)

Yeni bir dizi verilen sayısız öğeleri içeren oluşturur nesne.

Eğer bir blok verilirse, numaralama elemanları tarafından preprocessed blok verildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011