def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
এটি অনলাইন চেষ্টা করুন!
শূন্য-সূচক ব্যবহার করে।
একটি সহজ ধারণা সহ একটি দ্রুত অ্যালগরিদম। পাসে যেমন করতে আমরা পরিবর্তে ইনপুট তালিকা পরস্পর বিনিময় করা দরকার হয় তাহলে ( 1 ,2,...,n) সম্ভব হিসেবে আমরা, নিচের প্রমাণিত শুধু এটা সাজানোর উচিত। যেহেতু আমরা পরিবর্তে permuting করছি ( 1 , 2 , । । । ,n) , আমরা বিন্যাস চয়ন আমার চ্যালেঞ্জ মত, ইনপুট তালিকা হিসাবে একই ভাবে আদেশ একটি ক্রম অনুকরণ করুন (ইনপুট ছাড়া পুনরাবৃত্তি হতে পারে)। (সম্পাদনা করুন: মাইল মাইল এই আরও অভিন্ন চ্যালেঞ্জটি নির্দেশ করেছে , যেখানে ডেনিসের একই উত্তর রয়েছে ))
দাবি: তালিকা একটি বিন্যাস ঠ যে তার দূরত্ব ছোট ( 1 , 2 , । । । , এন ) হয় ঠ সাজানো।
প্রমাণ: কিছু অন্যান্য বিন্যাস বিবেচনা ঠ' এর ঠ । আমরা প্রমাণ করব এটি এল এর চেয়ে ভাল আর হতে পারে নাঠ সাজানো।
দুই সূচকের বাছুন i , j যে ঠ' আউট-অফ-অর্ডার আছে, যে যেখানে আমি < জে কিন্তু ঠ'আমি> এল'ঞ । আমরা দেখাই যে, তাদের সোয়াপিং দূরত্ব বৃদ্ধি করতে পারবে না ( 1 , 2 , । । । , এন ) । আমরা নোট করি যে অদলবদল এই দুটি উপাদানকে অবদানের পরিবর্তে নিম্নরূপ:
|l′i−i|+|l′j−j|→|l′i−j|+|l′j−i|.
এটি দেখানোর জন্য একটি পরিষ্কার উপায় এখানে বাড়ানো যাবে না। দুই জনের একটি সংখ্যা লাইনে হাঁটা, এক থেকে যাচ্ছে বিবেচনা l′i করতে i এবং থেকে অন্য l′j থেকে j । তারা চলার মোট দূরত্বটি বাম দিকের প্রকাশ। যেহেতু i<j তবে l′i>l′j , তারা নম্বর লাইনের উপরে কে বেশি, তার অর্থ তারা হাঁটার সময় কিছুটা সময় অতিক্রম করতে হবে, তাকে p । কিন্তু যখন তারা p, তারপরে তারা তাদের গন্তব্যগুলি অদলবদল করতে এবং একই মোট দূরত্বে চলতে পারে। এবং তারপরে, পি ব্যবহারের পরিবর্তে তাদের পক্ষে তাদের অদলবদল গন্তব্যগুলিতে যাওয়া খুব খারাপ হতে পারে নাp একটি ওয়েপয়েন্ট, যা ডান দিকে মোট দূরত্ব দেয় না।
সুতরাং, দুই আউট-অফ-অর্ডার উপাদান বাছাই ঠ' তার দূরত্ব করে তোলে ( 1 , 2 , । । । , এন ) ছোট বা একই। এই প্রক্রিয়াটির পুনরাবৃত্তিটি শেষ পর্যন্ত ঠ সাজবে। সুতরাং, ঠ সাজানো হয় অন্তত হিসাবে ভাল হিসাবে ঠ' কোন পছন্দ জন্য ঠ' , যা অনুকূল হিসাবে অথবা অনুকূল জন্য বাঁধা মানে।
নোট করুন যে একমাত্র সম্পত্তি ( 1 , 2 , । । । , এন ) যে আমরা ব্যবহৃত যে এটি অনুসারে বাছাই করা, যাতে কিনা একই এলগরিদম কোন নির্দিষ্ট তালিকা তার দূরত্ব কমানোর জন্য কোনো তালিকা স্থানপরিবর্তন করা কাজ করবে।
কোডে, এর একমাত্র উদ্দেশ্য z=zip(l,range(len(l)))
হ'ল ইনপুট উপাদানগুলিকে আলাদা করা, এটি সম্পর্কগুলি এড়ানো, অসম উপাদানগুলির মধ্যে একই তুলনা রেখে keeping যদি আমরা যে ইনপুটটির গ্যারান্টি দিয়েছিলাম তার পুনরাবৃত্তি না ঘটে তবে আমরা এটি সরিয়ে ফেলতে পারি এবং ঠিক আছে lambda l:map(sorted(l).index,l)
।
v
চেয়ে বেশি হবে0
? বা, কমপক্ষে, না0
?