এই উত্তরে, দুটি বিভাগ হবে: দুটি অনন্য সমাধান এবং নির্দিষ্ট সমাধানের জন্য গতির একটি গ্রাফ।
সদৃশ আইটেমগুলি সরানো হচ্ছে
এই উত্তরগুলির বেশিরভাগটি কেবলমাত্র নকল আইটেমগুলি মুছতে পারে যেগুলি হ্যাশযোগ্য , তবে এই প্রশ্নটি বোঝায় না যে এটির জন্য কেবল ধাবনযোগ্য আইটেমের প্রয়োজন নেই , অর্থাত্ আমি এমন কিছু সমাধান সরবরাহ করব যা হ্যাশেবলের প্রয়োজন হয় না offer আইটেমগুলির ।
সংগ্রহসমূহ.কাউন্টার স্ট্যান্ডার্ড লাইব্রেরির একটি শক্তিশালী সরঞ্জাম যা এটির জন্য নিখুঁত হতে পারে। এর মধ্যে একটি মাত্র অন্য সমাধান রয়েছে যা এর মধ্যে কাউন্টারও রয়েছে। যাইহোক, এই সমাধানটি হ্যাশ করার ক্ষেত্রেও সীমাবদ্ধ কীগুলির মধ্যে ।
কাউন্টারে অনির্ভরযোগ্য কীগুলি মঞ্জুরি দেওয়ার জন্য, আমি একটি ধারক শ্রেণী তৈরি করেছি, যা অবজেক্টের ডিফল্ট হ্যাশ ফাংশনটি পাওয়ার চেষ্টা করবে, কিন্তু যদি এটি ব্যর্থ হয় তবে এটি তার পরিচয় ফাংশনটি চেষ্টা করবে। এটি একটি সংজ্ঞায়িত EQ এবং একটি হ্যাশ পদ্ধতি। আমাদের দ্রবণে অলাভযোগ্য আইটেমগুলিকে অনুমতি দেওয়ার জন্য এটি যথেষ্ট হওয়া উচিত । অদৃশ্যযোগ্য বস্তুগুলি হ্যাশযোগ্য বলে মনে করা হবে। যাইহোক, এই হ্যাশ ফাংশনটি অবিশ্বাস্য জিনিসগুলির জন্য পরিচয় ব্যবহার করে, যার অর্থ দুটি সমান বস্তু যা উভয়ই অবিশ্বাস্যরূপে কাজ করবে না। আমি আপনাকে এটিকে ওভাররাইড করার পরামর্শ দিচ্ছি এবং সমতুল্য মিউটটেবল টাইপের হ্যাশ ব্যবহার করতে এটি পরিবর্তন করার পরামর্শ দিচ্ছি (যেমন hash(tuple(my_list))
যদি কোনও তালিকাগুলি ব্যবহার করে থাকে my_list
)।
আমি দুটি সমাধানও করেছি। অর্ডারডিক্ট এবং কাউন্টার উভয়ের একটি সাবক্লাস ব্যবহার করে আইটেমগুলির ক্রম বজায় রাখে এমন আরেকটি সমাধান, যার নাম দেওয়া হয়েছে 'অর্ডারড কাউন্টার'। এখন, এখানে ফাংশনগুলি রয়েছে:
from collections import OrderedDict, Counter
class Container:
def __init__(self, obj):
self.obj = obj
def __eq__(self, obj):
return self.obj == obj
def __hash__(self):
try:
return hash(self.obj)
except:
return id(self.obj)
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
def remd(sequence):
cnt = Counter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
def oremd(sequence):
cnt = OrderedCounter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
রিমড হ'ল নন-অর্ডার করা বাছাই, oremd বাছাইয়ের আদেশ দেওয়া হয়। কোনটি দ্রুত তা আপনি পরিষ্কারভাবে বলতে পারবেন, তবে আমি যেভাবেই হোক তা ব্যাখ্যা করব। অ-অর্ডারযুক্ত বাছাই করা কিছুটা দ্রুত। এটি কম ডেটা রাখে, যেহেতু এটির অর্ডার প্রয়োজন হয় না।
এখন, আমি প্রতিটি উত্তরের গতির তুলনাও দেখাতে চেয়েছিলাম। সুতরাং, আমি এখন এটি করব।
সবচেয়ে দ্রুততম কোন কাজটি?
সদৃশ অপসারণের জন্য, আমি কয়েকটি উত্তর থেকে 10 টি ফাংশন সংগ্রহ করেছি। আমি প্রতিটি ফাংশনের গতি গণনা করেছি এবং matplotlib.pyplot ব্যবহার করে একটি গ্রাফে রেখেছি ।
আমি এটিকে গ্রাফিংয়ের তিন রাউন্ডে বিভক্ত করেছি। একটি হ্যাশযোগ্য এমন কোনও বস্তু যা হ্যাশ করা যায়, হ্যাশ করা যায় না এমন কোনও বস্তু যা হ্যাশ করা যায় না। অর্ডার করা সিকোয়েন্স হ'ল একটি ক্রম যা আদেশ সংরক্ষণ করে, একটি আনর্ডারড সিকোয়েন্সটি অর্ডার সংরক্ষণ করে না। এখন, এখানে আরও কয়েকটি পদ রয়েছে:
আনর্ডার্ড হ্যাশেবল এমন কোনও পদ্ধতির জন্য ছিল যা ডুপ্লিকেটগুলি সরিয়ে , যাতে অ আদেশটি রাখার প্রয়োজন ছিল না। এটি অবিশ্বাস্যদের জন্য কাজ করতে হয়নি, তবে এটি পারে।
অর্ডার দিয়েছি হাসাবলিকে এমন কোনও পদ্ধতির জন্য হয়েছিল যা তালিকায় থাকা আইটেমগুলির ক্রম রেখেছিল, তবে এটি অবিশ্বাস্যদের জন্য কাজ করতে হয়নি, তবে এটি পারে।
অদৃশ্যযোগ্য আদেশ এমন কোনও পদ্ধতি যা তালিকার আইটেমগুলির বজায় রাখে এবং অবিশ্বাস্যদের জন্য কাজ করে।
Y- অক্ষের উপর এটি যে পরিমাণ সেকেন্ড নিয়েছিল তা হল।
এক্স-অক্ষে ফাংশনটি প্রয়োগ করা হয়েছিল সেই সংখ্যাটি।
আমরা অর্ডারার্ড হ্যাশাবলগুলির জন্য সিকোয়েন্স তৈরি করেছি এবং নিম্নলিখিত বোধগম্যতার সাথে হ্যাশাবলদের অর্ডার করেছি: [list(range(x)) + list(range(x)) for x in range(0, 1000, 10)]
অর্ডার করা অবিশ্বাস্যদের জন্য: [[list(range(y)) + list(range(y)) for y in range(x)] for x in range(0, 1000, 10)]
নোটটিতে একটি 'পদক্ষেপ' রয়েছে বলে মনে করুন কারণ এটি ছাড়াই এটি 10x বেশি সময় নিয়েছে। এছাড়াও আমার ব্যক্তিগত মতামত হিসাবে, আমি ভেবেছিলাম এটি পড়ার জন্য সম্ভবত কিছুটা সহজ দেখায়।
কিংবদন্তির কীগুলি হ'ল আমি ফাংশনের সবচেয়ে গুরুত্বপূর্ণ অংশ হিসাবে অনুমান করার চেষ্টা করেছি note কোন ফাংশনটি সবচেয়ে খারাপ বা সেরা করে? গ্রাফ নিজেই কথা বলে।
যে স্থির সঙ্গে, এখানে গ্রাফ আছে।
আনর্ডার্ড হ্যাশাবল
(জুম ইন)
অর্ডার করা হ্যাশাবলসকে
(জুম ইন)
অনাহাশাবলকে অর্ডার দিয়েছি
(জুম ইন)