এখানে সদৃশ সন্ধানের আরও দুটি উপায়।
একটি সেট ব্যবহার করুন
require 'set'
def find_a_dup_using_set(arr)
s = Set.new
arr.find { |e| !s.add?(e) }
end
find_a_dup_using_set arr
#=> "hello"
সমস্ত সদৃশ একটি অ্যারের ফিরে পেতে select
জায়গায় ব্যবহার করুন find
।
ব্যবহার Array#difference
class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
def find_a_dup_using_difference(arr)
arr.difference(arr.uniq).first
end
find_a_dup_using_difference arr
#=> "hello"
.first
সমস্ত অনুলিপিগুলির একটি অ্যারে ফেরত দিতে ড্রপ করুন ।
nil
কোনও সদৃশ না থাকলে উভয় পদ্ধতিই ফিরে আসে ।
আমি প্রস্তাব করেছি যেArray#difference
রুবি কোর যুক্ত করা হবে। আরও তথ্য এখানে আমার উত্তর হয় ।
মাপকাঠি
আসুন প্রস্তাবিত পদ্ধতিগুলি তুলনা করি। প্রথমত, পরীক্ষার জন্য আমাদের একটি অ্যারে প্রয়োজন:
CAPS = ('AAA'..'ZZZ').to_a.first(10_000)
def test_array(nelements, ndups)
arr = CAPS[0, nelements-ndups]
arr = arr.concat(arr[0,ndups]).shuffle
end
এবং বিভিন্ন পরীক্ষার অ্যারেগুলির জন্য মাপদণ্ড চালানোর একটি পদ্ধতি:
require 'fruity'
def benchmark(nelements, ndups)
arr = test_array nelements, ndups
puts "\n#{ndups} duplicates\n"
compare(
Naveed: -> {arr.detect{|e| arr.count(e) > 1}},
Sergio: -> {(arr.inject(Hash.new(0)) {|h,e| h[e] += 1; h}.find {|k,v| v > 1} ||
[nil]).first },
Ryan: -> {(arr.group_by{|e| e}.find {|k,v| v.size > 1} ||
[nil]).first},
Chris: -> {arr.detect {|e| arr.rindex(e) != arr.index(e)} },
Cary_set: -> {find_a_dup_using_set(arr)},
Cary_diff: -> {find_a_dup_using_difference(arr)}
)
end
আমি @ জেজেপির উত্তরটি অন্তর্ভুক্ত করি নি কারণ কেবলমাত্র একটি সদৃশ ফিরতে হবে এবং যখন তার উত্তরটি পরিবর্তন করতে হবে এটি @ নাভিদের আগের উত্তর হিসাবে একই same আমি @ মারিনের উত্তরও অন্তর্ভুক্ত করিনি, যা @ নাভিদের উত্তরের আগে পোস্ট করা হয়েছিল, কেবলমাত্র একটির চেয়ে সমস্ত নকলই ফেরত দিয়েছিল (একটি ছোট বিষয় তবে উভয়কেই মূল্যায়ন করার মতো কোনও বিষয় নেই, কারণ কেবলমাত্র একটি সদৃশ ফেরত দেওয়ার সময় তারা অভিন্ন)।
আমি অন্যান্য উত্তরগুলিও সংশোধন করেছিলাম যা পাওয়া গেছে কেবলমাত্র প্রথমটি পাওয়া যায় এবং ফিরে আসার জন্য সমস্ত অনুলিপি ফিরে এসেছিল, তবে এটির মূলত কোনও কার্যকারিতার উপর কোনও প্রভাব ফেলতে হবে না, কারণ তারা একটি নির্বাচন করার আগে সমস্ত নকলকে গণনা করেছিল।
প্রতিটি বেঞ্চমার্কের ফলাফলগুলি দ্রুত থেকে ধীরতম পর্যন্ত তালিকাভুক্ত করা হয়:
প্রথম ধরুন অ্যারেতে 100 টি উপাদান রয়েছে:
benchmark(100, 0)
0 duplicates
Running each test 64 times. Test will take about 2 seconds.
Cary_set is similar to Cary_diff
Cary_diff is similar to Ryan
Ryan is similar to Sergio
Sergio is faster than Chris by 4x ± 1.0
Chris is faster than Naveed by 2x ± 1.0
benchmark(100, 1)
1 duplicates
Running each test 128 times. Test will take about 2 seconds.
Cary_set is similar to Cary_diff
Cary_diff is faster than Ryan by 2x ± 1.0
Ryan is similar to Sergio
Sergio is faster than Chris by 2x ± 1.0
Chris is faster than Naveed by 2x ± 1.0
benchmark(100, 10)
10 duplicates
Running each test 1024 times. Test will take about 3 seconds.
Chris is faster than Naveed by 2x ± 1.0
Naveed is faster than Cary_diff by 2x ± 1.0 (results differ: AAC vs AAF)
Cary_diff is similar to Cary_set
Cary_set is faster than Sergio by 3x ± 1.0 (results differ: AAF vs AAC)
Sergio is similar to Ryan
10,000 টি উপাদান সহ একটি অ্যারে বিবেচনা করুন:
benchmark(10000, 0)
0 duplicates
Running each test once. Test will take about 4 minutes.
Ryan is similar to Sergio
Sergio is similar to Cary_set
Cary_set is similar to Cary_diff
Cary_diff is faster than Chris by 400x ± 100.0
Chris is faster than Naveed by 3x ± 0.1
benchmark(10000, 1)
1 duplicates
Running each test once. Test will take about 1 second.
Cary_set is similar to Cary_diff
Cary_diff is similar to Sergio
Sergio is similar to Ryan
Ryan is faster than Chris by 2x ± 1.0
Chris is faster than Naveed by 2x ± 1.0
benchmark(10000, 10)
10 duplicates
Running each test once. Test will take about 11 seconds.
Cary_set is similar to Cary_diff
Cary_diff is faster than Sergio by 3x ± 1.0 (results differ: AAE vs AAA)
Sergio is similar to Ryan
Ryan is faster than Chris by 20x ± 10.0
Chris is faster than Naveed by 3x ± 1.0
benchmark(10000, 100)
100 duplicates
Cary_set is similar to Cary_diff
Cary_diff is faster than Sergio by 11x ± 10.0 (results differ: ADG vs ACL)
Sergio is similar to Ryan
Ryan is similar to Chris
Chris is faster than Naveed by 3x ± 1.0
দ্রষ্টব্য যে সি তে প্রয়োগ করা find_a_dup_using_difference(arr)
হলে আরও কার্যকর Array#difference
হবে, এটি রুবি কোরকে যুক্ত করা হলে এমন হবে।
উপসংহার
উত্তরগুলির অনেকগুলি যুক্তিসঙ্গত তবে একটি সেট ব্যবহার করা স্পষ্ট সেরা পছন্দ । এটি মাঝারি-হার্ড ক্ষেত্রে সবচেয়ে দ্রুত, সবচেয়ে কঠিন মধ্যে যৌথ দ্রুত এবং কেবল গণনামূলকভাবে তুচ্ছ ক্ষেত্রে - যখন আপনার পছন্দটি কোনওভাবেই গুরুত্ব দেয় না - এটি মারধর করা যেতে পারে।
আপনি ক্রিসের সমাধানটি বেছে নিতে পারেন তার মধ্যে একটি বিশেষ ক্ষেত্রে হ'ল আপনি যদি হাজার হাজার ছোট অ্যারে আলাদাভাবে ডি-নকল করতে পদ্ধতিটি ব্যবহার করতে চান এবং 10 টিরও কম আইটেম খুব সহজেই খুঁজে পাবেন This এটি কিছুটা দ্রুত হবে This এটি সেট তৈরির ক্ষেত্রে অতিরিক্ত অতিরিক্ত ওভারহেড এড়িয়ে চলে।
arr == arr.uniq
arr
সদৃশগুলি আছে কিনা তা যাচাই করার জন্য একটি সহজ এবং মার্জিত উপায় হতে পারে , তবে এটি সদৃশ ছিল যা সরবরাহ করে না।