(روبي) إذا كانت مجموعة من تقاطع المشغل ( & ) غير فعال لما هو متاح ؟

StackOverflow https://stackoverflow.com/questions/701980

  •  22-08-2019
  •  | 
  •  

سؤال

سألت السؤال أمس عن مقارنة بين التداخل و كانت عالقة في حلقي من أي وقت مضى منذ.

يبدو أن الآراء التي بلدي المفضل الجواب الذي ينطوي على استخدام مجموعة تقاطع المشغل (&), غير فعالة لأن مقارنة المصفوفات مكلف.

وأتساءل لماذا هذه الميزة في اللغة ؟ هل يمكن أن تكون اللغة المبدعين يعتقد أنه في بعض الأحيان كنت بحاجة إلى وسيلة أنيقة لتحقيق حل حتى لو كانت مكلفة القيام بذلك ؟ هو مقارنة المصفوفات مكلفة جدا أنه يجب تجنب ذلك كلما كان ذلك ممكنا ؟ كله جذب روبي بالنسبة لي هو التركيز على النحوية الأناقة أكثر من السابق لأوانه الأمثل.

هل كانت مفيدة؟

المحلول

و& ليست طريقة فعالة بشكل خاص. أعتقد أنك يساء فهم الانتقادات من الإجابة المقبولة.

والحل المفضل لديك غير فعال لأنه يحول النطاقات صفائف.

وهناك مجموعة مثل 1..10000 له أثر الذاكرة صغيرة نسبيا - لأنه يخزن فقط بداية ونقطة نهاية. ولكن إذا كنت تحويله إلى مجموعة، يمكنك تخصيص الذاكرة لجميع مداخل 10000.

نصائح أخرى

يوم أمس مسألة صياغة جعلت الأمر يبدو كما لو كنت الحوسبة الثنائية الحالة:هل هذه النطاقات التداخل ؟ الإجابات التي أعطيت يمكن حسابها في وقت ثابت ، حتى إذا كانوا يعملون لك ، فمن المنطقي أن نبقى معهم.

المعامل & شأنه أن يكون مناسبا إذا كنت بحاجة إلى معرفة حد من التداخل ، ولكن لم يكن هذا ما كنت تسأل عنه.

بالنسبة لما هو موجود في كل شيء ، لا يمكن التكهن فقط:ليس فقط أنها لا تضيف الراحة, ولكن ليس من الصعب أن نتصور الطرق التي صفيف بالتزامن العملية يمكن أن يكون الأمثل من خلال بيئة اللغة-حتى إذا كان الحساب قد لا تزال تتطلب الخطية أو ن*log(n) الوقت في أسوأ الحالات.(إن كل العملية يجب أن يكون ثابت-نتيجة الوقت علينا التخلص من عدد غير قليل من الطرق!)

والمصفوفات في روبي هي مصنف: أنها يمكن أن تحتوي على مزيج من الأنواع بما في ذلك التجزئة، المصفوفات الأخرى، والرموز، أيا كان. في مجموعة كتبته الفرز والمقارنة هو أبسط من ذلك بكثير. وبمقارنة مجموعات مصنف (وخاصة المجموعات التي تحتوي على مجموعات) هي أكثر تكلفة من الطبيعة.

ولا يبدو سيئا للغاية من حيث اختبار. وكان الجهاز i7 من (2.0GHZ ثنائي النواة)

#!/bin/ruby
require 'benchmark'
n = []
1.upto(10_000_000) do |i|
  n << i
end

m = Array.new(1000000){ rand(10_000_000)+1 }

Benchmark.bm(10) do |x|
  x.report('array_intersection'){ n & m }
end

                    user     system      total        real
array_intersection  2.870000   0.040000   2.910000 (  2.895202)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top