এটি নকল হিসাবে বন্ধ হওয়ার আগে পাইথন ৩.৪৪ সেটটির আরও প্রতিক্রিয়া ।
অন্যরা ঠিক বলেছেন: আদেশের উপর নির্ভর করবেন না। এমনকি একটি আছে ভান করবেন না।
এটি বলেছিল, আপনি নির্ভর করতে পারেন এমন একটি জিনিস রয়েছে:
list(myset) == list(myset)
যে, আদেশ স্থিতিশীল ।
কেন বোঝা অর্ডার রয়েছে তা বোঝার জন্য কয়েকটি জিনিস বোঝার প্রয়োজন:
পাইথন হ্যাশ সেট ব্যবহার করে ,
সিপিথনের হ্যাশ সেটটি কীভাবে মেমোরিতে সংরক্ষণ করা হয় এবং
কীভাবে সংখ্যাগুলি হ্যাশ হয়
উপর থেকে:
একটি হ্যাশ সেটটি সত্যই দ্রুত দেখার সময় সহ এলোমেলো ডেটা সংরক্ষণ করার একটি পদ্ধতি।
এটিতে একটি ব্যাকিং অ্যারে রয়েছে:
# A C array; items may be NULL,
# a pointer to an object, or a
# special dummy object
_ _ 4 _ _ 2 _ _ 6
আমরা বিশেষ ডামি অবজেক্টকে এড়িয়ে যাব, যা কেবলমাত্র মোকাবেলায় সরানো সহজতর করার জন্য বিদ্যমান, কারণ আমরা এই সেটগুলি থেকে সরব না।
সত্যিই দ্রুত সন্ধানের জন্য, আপনি কোনও বস্তু থেকে একটি হ্যাশ গণনা করতে কিছু জাদু করেন। একমাত্র নিয়ম যে দুটি বস্তু সমান যা একই হ্যাশযুক্ত। (তবে দুটি বস্তুর যদি একই হ্যাশ থাকে তবে তারা অসম হতে পারে))
তারপরে আপনি অ্যারে দৈর্ঘ্য অনুসারে মডিউল নিয়ে সূচকটি তৈরি করবেন:
hash(4) % len(storage) = index 2
এটি উপাদানগুলিতে অ্যাক্সেস করা সত্যিই দ্রুত করে তোলে।
হ্যাশগুলি কেবল গল্পের বেশিরভাগ অংশ hash(n) % len(storage)
এবং hash(m) % len(storage)
একই সংখ্যার ফলাফল হতে পারে। সেক্ষেত্রে বেশ কয়েকটি ভিন্ন কৌশল চেষ্টা করে বিরোধটি সমাধান করতে পারে। সিপিথন জটিল কাজগুলি করার আগে 9 বার "লিনিয়ার প্রোবিং" ব্যবহার করে, তাই অন্য কোথাও দেখার আগে এটি 9 টি পর্যন্ত স্লটের বাম দিকে তাক করবে।
সিপথনের হ্যাশ সেটগুলি এভাবে সংরক্ষণ করা হয়:
একটি হ্যাশ সেট 2/3 এর বেশি পূর্ণ হতে পারে না । যদি 20 টি উপাদান থাকে এবং ব্যাকিং অ্যারেটি 30 টি উপাদান দীর্ঘ হয় তবে ব্যাকিং স্টোরটি বৃহত্তর আকারে আকার পরিবর্তন করবে। এটি কারণ ছোট ছোট ব্যাকিং স্টোরগুলির সাথে আপনি প্রায়শই সংঘর্ষ পান এবং সংঘর্ষগুলি সমস্ত কিছু কমিয়ে দেয়।
ব্যাকিং স্টোরটি 4 টির আকারে আকার দেয়, 8 থেকে শুরু করে, বড় সেটগুলি (50 ক উপাদানগুলি) বাদে যা দুটি শক্তির আকার পরিবর্তন করে: (8, 32, 128, ...)।
সুতরাং আপনি যখন একটি অ্যারে তৈরি করবেন তখন ব্যাকিং স্টোরটি দৈর্ঘ্য 8 হয় it যখন এটি 5 টি পূর্ণ হয় এবং আপনি কোনও উপাদান যুক্ত করেন, এতে সংক্ষেপে 6 টি উপাদান থাকবে। 6 > ²⁄₃·8
সুতরাং এটি একটি আকার পরিবর্তন করতে পারে এবং ব্যাকিং স্টোরটি 32 মাপের চতুর্দিকে।
পরিশেষে, hash(n)
কেবল n
সংখ্যার জন্য ফেরত দেয় (বাদে -1
বিশেষ)।
সুতরাং, আসুন প্রথমটি দেখুন:
v_set = {88,11,1,33,21,3,7,55,37,8}
len(v_set)
10, তাই সমস্ত আইটেম যুক্ত হওয়ার পরে ব্যাকিং স্টোরটি কমপক্ষে 15 (+1) হয় । 2 এর প্রাসঙ্গিক শক্তি 32. সুতরাং ব্যাকিং স্টোরটি হ'ল:
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
আমাদের আছে
hash(88) % 32 = 24
hash(11) % 32 = 11
hash(1) % 32 = 1
hash(33) % 32 = 1
hash(21) % 32 = 21
hash(3) % 32 = 3
hash(7) % 32 = 7
hash(55) % 32 = 23
hash(37) % 32 = 5
hash(8) % 32 = 8
সুতরাং এই হিসাবে সন্নিবেশ:
__ 1 __ 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
33 ← Can't also be where 1 is;
either 1 or 33 has to move
সুতরাং আমরা যেমন একটি আদেশ আশা করব
{[1 or 33], 3, 37, 7, 8, 11, 21, 55, 88}
1 বা 33 এর সাথে যা অন্য কোথাও শুরুতে নয়। এটি লিনিয়ার প্রোবিং ব্যবহার করবে, সুতরাং আমাদের হয় হয়:
↓
__ 1 33 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
অথবা
↓
__ 33 1 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
আপনি সম্ভবত 33 টি বাস্তুচ্যুত হয়ে উঠবেন বলে আশা করতে পারেন কারণ 1 ইতিমধ্যে সেখানে ছিল, তবে সেটটি তৈরি হবার সাথে সাথে পুনরায় আকার দেওয়ার কারণে এটি আসলে ঘটেনি। প্রতিবার সেটটি পুনরায় তৈরি হয়ে গেলে, ইতিমধ্যে যুক্ত করা আইটেমগুলি কার্যকরভাবে পুনরায় সাজানো হয়।
এখন আপনি দেখতে পারেন কেন
{7,5,11,1,4,13,55,12,2,3,6,20,9,10}
ক্রম হতে পারে। এখানে 14 টি উপাদান রয়েছে, তাই ব্যাকিং স্টোরটি কমপক্ষে 21 + 1, যার অর্থ 32:
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
প্রথম 13 স্লটে 1 থেকে 13 হ্যাশ। 20 স্লটে যায় 20।
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ __ __ 20 __ __ __ __ __ __ __ __ __ __ __
55 স্লটে যায় hash(55) % 32
যা 23:
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ __ __ 20 __ __ 55 __ __ __ __ __ __ __ __
আমরা যদি এর পরিবর্তে 50 টি পছন্দ করি তবে আমরা আশা করব
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ 50 __ 20 __ __ __ __ __ __ __ __ __ __ __
এবং দেখুন এবং দেখুন:
{1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 20, 50}
#>>> {1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 50, 20}
pop
জিনিসগুলির চেহারা দ্বারা বেশ সহজভাবে প্রয়োগ করা হয়: এটি তালিকাটিকে পিছনে ফেলে এবং প্রথমটিকে পপ করে।
এটি সমস্ত বাস্তবায়ন বিশদ।