অ্যারে অন্য অ্যারে থেকে কোন মান অন্তর্ভুক্ত?


155

যদি অ্যারেতে দ্বিতীয় অ্যারে থেকে কোনও উপাদান থাকে তবে পরীক্ষার সর্বাধিক দক্ষ উপায় কোনটি?

নীচে দুটি উদাহরণ, প্রশ্নের উত্তর দেওয়ার চেষ্টাতে যে foodsকোনও উপাদান রয়েছে cheeses:

cheeses = %w(chedder stilton brie mozzarella feta haloumi reblochon)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)

puts cheeses.collect{|c| foods.include?(c)}.include?(true)

puts (cheeses - foods).size < cheeses.size

উত্তর:


268
(cheeses & foods).empty?

মার্ক-আন্দ্রে লাফোর্টুন যেমন মন্তব্যে বলেছিলেন, &রৈখিক সময়ে কাজ করে যখন any?+ include?চতুর্ভুজ হবে। বড় আকারের ডেটাগুলির জন্য, রৈখিক সময় দ্রুত হবে। ছোট ডেটা সেটগুলির জন্য, লি জার্ভিসের জবাব দ্বারা দেখানো হিসাবে any?+ আরও include?দ্রুত হতে পারে - সম্ভবত কারণ &একটি নতুন অ্যারে বরাদ্দ করে যখন অন্য সমাধান না করে এবং একটি বুলিয়ান ফেরত দেওয়ার জন্য সরল নেস্টেড লুপ হিসাবে কাজ করে।


3
কোনও অ্যারেতে অন্য অ্যারে থেকে উপাদান রয়েছে কিনা তা পরীক্ষা করার সময়, এটি কী (চিজ এবং খাবার) বেশি বোঝায় না? এটি যদি সত্যিকারের মান দেয় তবে অ্যারেগুলিতে আসলে একই উপাদানগুলির কোনও থাকে?
রায়ান ফ্রান্সিস 21

1
@RyanFrancis, দস্তাবেজ: any?: পদ্ধতি ফেরৎ সত্য যদি ব্লক কি কখনো মিথ্যা বা শূন্য ছাড়া অন্য একটি মান ফেরায়। empty?: যদি স্বতে কোনও উপাদান না থাকে তবে সত্য ফিরে আসে।
নাকিলন

3
@ নাকিলন আমিও বিভ্রান্ত হলাম কেন উত্তর (cheeses & foods).any?ওপি-র প্রশ্ন নয়: যদি কোনও খাবার চিজ হয়? তার উদাহরণে, "ফেটা" উভয়েই আছে, সুতরাং ফলাফলটি সত্য হওয়া উচিত, তাই না? তাহলে কেন .empty?ছেদ করে পরীক্ষা ?
সাকারফরমেহেম

@ সুকারফোর্ডমহেম, কারণ ওপির প্রশ্নটি "যদি কেউ থাকে ... ?", কেবল "যদি থাকে?" নয়। যদি " হয় ... " বাদ দেওয়া হয় তবে এটি "যদি সত্য হয়? " বলে মনে করা হয় এবং এটি অ্যারের জন্য মিথ্যা ফিরিয়ে দেয় [false, false, false]তবে স্পষ্টতই এটি খালি নয়।
নাকিলন

অ্যাক্টিভেকর্ড স্তরে কি কোনও বাস্তবায়ন আছে?
লি চুন হো

35

কোন # গণনার সম্পর্কে ?

>> cheeses = %w(chedder stilton brie mozzarella feta haloumi)
=> ["chedder", "stilton", "brie", "mozzarella", "feta", "haloumi"]
>> foods = %w(pizza feta foods bread biscuits yoghurt bacon)
=> ["pizza", "feta", "foods", "bread", "biscuits", "yoghurt", "bacon"]
>> foods.any? {|food| cheeses.include?(food) }
=> true

বেঞ্চমার্ক লিপি:

require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"

CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze

Benchmark.bm(15) do |b|
  b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }
  b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }
end

ফলাফল:

ruby version: 2.1.9
                      user     system      total        real
&, empty?         1.170000   0.000000   1.170000 (  1.172507)
any?, include?    0.660000   0.000000   0.660000 (  0.666015)

আপনি cheesesসেটটিতে পরিণত করে এটিকে উন্নত করতে পারেন ।
akuhn

1
রুবি ২.২..7 এবং ২.৩.৪ এ আমার নিজস্ব বেঞ্চমার্কটি রান করুন এবং any?, include?সবচেয়ে দ্রুততম ছিলেন, সবচেয়ে ধীরে ধীরে সেট আপ করুন: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497
জ্যারেড

4
এই মানদণ্ডটি উল্লিখিত নির্দিষ্ট উদাহরণ দ্বারা পক্ষপাতদুষ্ট এবং অগত্যা আরও সাধারণ ক্ষেত্রে ধরা দেয় না। যদি দুটি অ্যারের মধ্যে কোনও সাধারণ উপাদান না থাকে তবে কী হবে? অ্যারেগুলি যদি প্রতিটি পাসে আলাদা ক্রমে থাকে? উভয় অ্যারে শেষে যদি ফেটা হাজির হয়? মার্ক-আন্দ্রে যেমন বলেছিলেন, সেট ছেদটি রৈখিক সময়ে কার্যকর হয়, সুতরাং এটি স্পষ্ট করে তোলে যে সাধারণ ক্ষেত্রে এটি আরও বেশি পরিমাণে স্কেলযোগ্য, প্রশ্নটির ব্যাখ্যা দেওয়ার জন্য বিশুদ্ধরূপে ব্যবহৃত একটি নির্দিষ্ট উদাহরণের চেয়ে।
user2259664

22

চৌরাস্তাটি খালি কিনা তা আপনি পরীক্ষা করতে পারেন।

cheeses = %w(chedder stilton brie mozzarella feta haloumi)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
foods & cheeses
=> ["feta"] 
(foods & cheeses).empty?
=> false

1
Set.new(cheeses).disjoint? Set.new(foods)

এছাড়াও আমার (অবৈজ্ঞানিক) মাপদণ্ডে
জ্যারেড

1
তোমার মন্তব্যের জন্য ধন্যবাদ. কেন এটি নতুন করে সেট করা হয়নি তা আমি নিশ্চিত নই তবে আমি এটি সম্পাদনা করেছি। আমি আপনার পারফরম্যান্সের মানদণ্ডটি ২.৪.১ এ চেষ্টা করেছি। মাইন আরও ভাল করেছে তবে আরও শব্দযুক্ত সমন্বিত সেটগুলি ব্যবহার করে এখনও সেরা নয়। আমি আপনার ভাষায় একটি মন্তব্য আমার সংস্করণ রাখি। আমিও মনে করি disjoint?খুব মার্জিত, বিশেষত "যে কোনও ?, অন্তর্ভুক্ত?" এর সাথে তুলনা করা। আসল প্রশ্নটি মার্জিত এবং দক্ষ উভয়ই সম্পর্কে জিজ্ঞাসা করেছিল।
ডেভিডকভস্কি

.to_setপদ্ধতিটি এখানে দরকারী হতে পারেcheeses.to_set.disjoint?(foods.to_set)
nnnikolay

0
require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"

CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze

Benchmark.bm(15) do |b|
  b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }  
  b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }  
  b.report("disjoint?") { N.times { FOODS.to_set.disjoint? CHEESES.to_set }}
end  
                      user     system      total        real
&, empty?         0.751068   0.000571   0.751639 (  0.752745)
any?, include?    0.408251   0.000133   0.408384 (  0.408438)
disjoint?        11.616006   0.014806  11.630812 ( 11.637300)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.