অজগরের সেটগুলিতে 'উদ্ভট' ক্রম


14

আমি যখন পাইথন ৩.৮.০ তালিকাকে একটি সেটে রূপান্তর করি, ফলাফল সেট অর্ডারিং * খুব তুচ্ছভাবে কাঠামোগত হয়। ছদ্ম-এলোমেলো তালিকা থেকে এই কাঠামোটি কীভাবে নেওয়া হচ্ছে?


আমি যে পরীক্ষা চালাচ্ছি তার অংশ হিসাবে, আমি একটি এলোমেলো সেট তৈরি করছি। আমি অবাক হয়ে দেখলাম যে সেটটি প্লট করা হঠাৎ করে সেটে অপ্রত্যাশিত লিনিয়ার কাঠামো দেখিয়েছিল। সুতরাং দুটি বিষয় আমাকে বিস্মিত করছে - একটি সেট ফলাফলে রূপান্তর কেন একটি ক্রম * থাকে যা এই কাঠামোটি হাইলাইট করে শেষ করে; এবং, কিছুটা হলেও সিউডো-এলোমেলো সেটটিতে কেন এই "লুকানো" কাঠামো আছে?

কোড:

X = [randrange(250) for i in range(30)]
print(X)
print(set(X))

উদাহরণস্বরূপ, যা ফলাফল

[238, 202, 245, 94, 111, 106, 148, 164, 154, 113, 128, 10, 196, 141, 69, 38, 106, 8, 40, 53, 160, 87, 85, 13, 38, 147, 204, 50, 162, 91]

{128, 8, 10, 141, 13, 147, 148, 154, 160, 162, 164, 38, 40, 50, 53, 196, 69, 202, 204, 85, 87, 91, 94, 106, 238, 111, 113, 245}

উপরের তালিকার একটি প্লট ** মোটামুটি এলোমেলো মনে হচ্ছে, যেমনটি প্রত্যাশিত:

এলোমেলোভাবে উত্পাদিত তালিকার ওল্ফ্রামআল্ফার প্লট

যেখানে সেট প্লট করা (যেমন এটি আউটপুটে আদেশ করা হয়েছে) সেটে উপস্থিত কাঠামো প্রদর্শন করে:

ওলোফ্রামআল্ফার প্লট এলোমেলো তালিকা থেকে

এই আচরণটি আমার মেশিনে 100% সামঞ্জস্যপূর্ণ (নীচে আরও উদাহরণগুলি) উপরের কোডটিতে ব্যবহৃত 250 এবং 30 মানগুলির সাথে (আমি ব্যবহৃত উদাহরণটি চেরি বাছাই করা হয়নি - এটি আমার শেষ দৌড়ে এসেছিল)। এই মানগুলি টিউন করার ফলে মাঝে মাঝে কিছুটা আলাদা কাঠামো হয় (উদাহরণস্বরূপ তিনটি পাটিগণিত অগ্রগতির একটি উপসেট *** দুটি পরিবর্তে)।

এটি কি অন্য মানুষের মেশিনে পুনরুত্পাদনযোগ্য? অবশ্যই, এই জাতীয় কাঠামোটি বিদ্যমান নয় এমন একটি ছদ্ম-এলোমেলো সংখ্যা জেনারেশনের সূচক বলে মনে হয় তবে কোনও সেটকে রূপান্তর করা এই কাঠামোর কোনও অর্থে কীভাবে 'এক্সট্রাক্ট' করবে তা ব্যাখ্যা করে না। আমি যতটুকু অবগত আছি, সেখানে কোনও আনুষ্ঠানিক গ্যারান্টি নেই যে একটি সেট অর্ডারিং (যখন তালিকা থেকে রূপান্তরিত হয়) নির্বিচারক (এবং এমনকি তা সত্ত্বেও, পটভূমিতে কোনও অত্যাধুনিক অর্ডিংও হচ্ছে না)। তাহলে কেমন হচ্ছে ?!


(*): আমি জানি, সেটগুলি সীমানাবিহীন সংগ্রহসমূহ, তবে আমার অর্থ "অর্ডার করা" এই অর্থে যে বয়ানটি কল করার printসময় সেটটি কোনও ক্রমে আউটপুট হয় যা ধারাবাহিকভাবে অন্তর্নিহিত সেট কাঠামোটি হাইলাইট করে।

(**): এই প্লটগুলি ওল্ফ্রাম আলফার। আরও দুটি উদাহরণ নীচে রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

(***): 250 থেকে 500 এলোমেলো সংখ্যার পরিসর পরিবর্তন করার সময় দুটি প্লট:

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


14

মূলত, এটি দুটি জিনিসগুলির কারণে:

  • পাইথনের একটি সেট হ্যাশ টেবিল ব্যবহার করে প্রয়োগ করা হয় ,
  • একটি পূর্ণসংখ্যার হ্যাশ হ'ল পূর্ণসংখ্যা।

সুতরাং, অন্তর্নিহিত অ্যারেতে কোনও পূর্ণসংখ্যা প্রদর্শিত সূচকটি পূর্ণসংখ্যার মান দ্বারা নির্ধারিত হবে, অন্তর্নিহিত অ্যারের দৈর্ঘ্যকে মডুলো করে। সুতরাং, আপনি যখন সেটগুলিতে একটি সামঞ্জস্যপূর্ণ পরিসীমা স্থাপন করেন তখন পূর্ণসংখ্যাগুলি আরোহণের ক্রমে থাকবে:

>>> list(set(range(10000))) == list(range(10000))
True # this can't be an accident!

যদি আপনার কাছে একটি সংক্ষিপ্ত পরিসীমা থেকে সমস্ত নম্বর না থাকে, তবে "অন্তর্নিহিত অ্যারের দৈর্ঘ্য" মডেলটি খেলতে আসে:

>>> r = range(0, 50, 4)
>>> set(r)
{0, 32, 4, 36, 8, 40, 12, 44, 16, 48, 20, 24, 28}
>>> sorted(r, key=lambda x: x % 32)
[0, 32, 4, 36, 8, 40, 12, 44, 16, 48, 20, 24, 28]

যদি আপনি অন্তর্নিহিত অ্যারেটির দৈর্ঘ্য এবং উপাদানগুলি যুক্ত করার জন্য (নির্ধারক) অ্যালগরিদম জানেন তবে অনুক্রমটি অনুমানযোগ্য। এক্ষেত্রে অ্যারের দৈর্ঘ্য 32, কারণ এটি প্রাথমিকভাবে 8 হয় এবং উপাদানগুলি যুক্ত করার সময় চতুর্ভুজ হয়।

শেষের কাছাকাছি একটি ব্লিপ ব্যতীত (কারণ 52 এবং 56 সংখ্যাটি সেটে নেই), পরিসীমাটি দুটি অনুচ্ছেদে বিভক্ত হয়েছে 0, 4, 8, ...এবং 32, 36, 40, ...এটি বিকল্প কারণ হ্যাশগুলি, যা সংখ্যার মান হিসাবে রয়েছে, বেছে নেওয়ার জন্য মডুলো 32 নেওয়া হয় অ্যারে সূচকগুলি। সংঘর্ষ রয়েছে; উদাহরণস্বরূপ, 4 এবং 36 সমতুল্য মডুলো 32, তবে 4 টি প্রথমে সেটে যুক্ত হয়েছিল তাই 36 টি আলাদা সূচীতে শেষ হয়।

এই ক্রম জন্য এখানে একটি চার্ট। আপনার চার্টগুলির কাঠামোটি কেবলমাত্র একটি শোরগোলের সংস্করণ, কারণ আপনি একটি পদক্ষেপ সহ একটি পরিসীমা ছাড়াই এলোমেলোভাবে আপনার সংখ্যা তৈরি করেছেন।

এখানে চিত্র বর্ণনা লিখুন

আন্তঃবাহিত সিকোয়েন্সগুলির সংখ্যা সংখ্যার নমুনা নির্ধারিত সীমার দৈর্ঘ্যের অনুপাতে সেট আকারের উপর নির্ভর করবে, যেহেতু এটি নির্ধারণ করে যে হ্যাশটেবলের অন্তর্নিহিত অ্যারেটির দৈর্ঘ্যের "চারপাশে মোড়ানো" কতবার হয়। এখানে তিনটি দর্শন অন্তর্বর্তীবিরতি সিকোয়েন্স সঙ্গে একটি উদাহরণ 0, 6, 12, ..., 66, 72, 78, ...এবং 36, 42, 48, ...:

>>> set(range(0, 90, 6))
{0, 66, 36, 6, 72, 42, 12, 78, 48, 18, 84, 54, 24, 60, 30}

আহ! এটি এটি ব্যাখ্যা করে (এবং দুর্দান্ত ব্যাখ্যাও)!
জন ডন

এবং অবশ্যই, প্লটের এই প্যাটার্নটি সেটের অন্তর্নিহিত কাঠামোর সাথে কোনও সম্পর্কযুক্ত নয় (আমরা উদাহরণটিতে যেমন র্যান্ডম তালিকাগুলি সহ প্লটগুলিতে এই প্যাটার্নটি উত্থিত হওয়ার আশা করব) ... আমি কেবল অপ্রত্যাশিত নিদর্শন দ্বারা প্রলুব্ধ হয়েছি প্লট!
জন ডন

আপনি কীভাবে খুঁজে পাবেন যে 30 টি অন্তর্নিহিত অ্যারের দৈর্ঘ্য?
মার্ক স্নাইডার

@MarkSnyder এটি সক্রিয় আউট এটা 32 যার মানে সেখানে দুর্ঘটনায় রয়েছে, কিন্তু যেমন যদি এটা ছিল মডিউল 30. অর্ডার একই
kaya3

2
@ মার্কস্নাইডার অ্যারেটি 2/3 এর বেশি পূর্ণ হলে অ্যারেটি পুনরায় আকার দেওয়া হবে , যেহেতু আপনি যদি অ্যারেটি পুরো বা প্রায় পূর্ণ হতে দেন তবে হ্যাশটেবলের পারফরম্যান্স খুব উল্লেখযোগ্যভাবে হ্রাস পাবে।
কেয়া 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.