ফানসিটন , অ-প্রতিযোগিতামূলক
হালনাগাদ! ব্যাপক পারফরম্যান্সের উন্নতি! n = 7 এখন 10 মিনিটের নিচে পূর্ণ! নীচে ব্যাখ্যা দেখুন!
এটি লিখতে ভাল মজা ছিল। এটি ফানসিটনে লিখিত এই সমস্যার জন্য একটি নিষ্ঠুর-শক্তি সমাধানকারী। কিছু ফ্যাক্টয়েড:
- এটি STDIN- তে একটি পূর্ণসংখ্যা গ্রহণ করে। কোনও বহিরাগত শ্বেত স্পেস এটি ভেঙে দেয়, পূর্ণসংখ্যার পরে একটি নতুন লাইন সহ।
- এটি 0 থেকে n - 1 (1 থেকে n নয় ) সংখ্যা ব্যবহার করে ।
- এটি গ্রিডটি "পিছনের দিকে" পূরণ করে, সুতরাং নীচের সারিটি
3 2 1 0
শীর্ষ সারিটি যেখানে পড়া হবে তার চেয়ে আপনি নীচের সারিটি যেখানে পড়েন সেখানে একটি সমাধান পান 0 1 2 3
।
- এটি এন = 1 এর সঠিকভাবে আউটপুট করে
0
(একমাত্র সমাধান) ।
- N = 2 এবং n = 3 এর জন্য খালি আউটপুট ।
- কোনও এক্সে-তে সংকলিত হয়ে গেলে, এন = 7 এর জন্য প্রায় 8¼ মিনিট সময় লাগে (পারফরম্যান্স উন্নতির প্রায় এক ঘন্টা আগে)। সংকলন ছাড়াই (দোভাষী ব্যবহার করে) এটি প্রায় 1.5 গুণ সময় নেয়, তাই সংকলকটি ব্যবহার করা এটির পক্ষে উপযুক্ত।
- ব্যক্তিগত মাইলফলক হিসাবে, আমি প্রথমবার সিউডোকোড ভাষায় প্রোগ্রামটি না লিখে পুরো ফানসিটন প্রোগ্রামটি লিখেছিলাম। আমি যদিও এটি প্রথমে আসল সি # তে লিখেছি।
- (তবে, আমি প্রথমবারের মতো ফানসিটনের কোনও কিছুর পারফরম্যান্সের ব্যাপক উন্নতি করতে পরিবর্তন এনেছি না। প্রথমবারের মতো আমি ঘটনাটির কাজটি করেছি the গুণটির অপারেশনগুলির ক্রমটি অদলবদলের কারণে একটি বিশাল পার্থক্য হয়েছিল গুণটি অ্যালগরিদম কীভাবে কাজ করে Just যদি আপনি কৌতূহলী হন case)
আরও ঝামেলা ছাড়া:
┌────────────────────────────────────┐ ┌─────────────────┐
│ ┌─┴─╖ ╓───╖ ┌─┴─╖ ┌──────┐ │
│ ┌─────────────┤ · ╟─╢ Ӂ ╟─┤ · ╟───┤ │ │
│ │ ╘═╤═╝ ╙─┬─╜ ╘═╤═╝ ┌─┴─╖ │ │
│ │ └─────┴─────┘ │ ♯ ║ │ │
│ ┌─┴─╖ ╘═╤═╝ │ │
│ ┌────────────┤ · ╟───────────────────────────────┴───┐ │ │
┌─┴─╖ ┌─┴─╖ ┌────╖ ╘═╤═╝ ┌──────────┐ ┌────────┐ ┌─┴─╖│ │
│ ♭ ║ │ × ╟───┤ >> ╟───┴───┘ ┌─┴─╖ │ ┌────╖ └─┤ · ╟┴┐ │
╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌─────┤ · ╟───────┴─┤ << ╟─┐ ╘═╤═╝ │ │
┌───────┴─────┘ ┌────╖ │ │ ╘═╤═╝ ╘══╤═╝ │ │ │ │
│ ┌─────────┤ >> ╟─┘ │ └───────┐ │ │ │ │ │
│ │ ╘══╤═╝ ┌─┴─╖ ╔═══╗ ┌─┴─╖ ┌┐ │ │ ┌─┴─╖ │ │
│ │ ┌┴┐ ┌───────┤ ♫ ║ ┌─╢ 0 ║ ┌─┤ · ╟─┤├─┤ ├─┤ Ӝ ║ │ │
│ │ ╔═══╗ └┬┘ │ ╘═╤═╝ │ ╚═╤═╝ │ ╘═╤═╝ └┘ │ │ ╘═╤═╝ │ │
│ │ ║ 1 ╟───┬┘ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ │ │ │ ┌─┴─╖ │
│ │ ╚═══╝ ┌─┴─╖ │ ɓ ╟─────────────┤ ? ╟─┘ │ ┌─┴─╖ │ ├─┤ · ╟─┴─┐
│ ├─────────┤ · ╟─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴────┤ + ╟─┘ │ ╘═╤═╝ │
┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═╧═╕ ╔═══╗ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╘═══╝ │ │ │
┌─┤ · ╟─┤ · ╟───┐ └┐ └─╢ ├─╢ 0 ╟─┤ ⌑ ╟─┤ ? ╟─┤ · ╟──────────────┘ │ │
│ ╘═╤═╝ ╘═╤═╝ └───┐ ┌┴┐ ╚═╤═╛ ╚═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴─╖ ┌───╖ │ └┬┘ ┌─┴─╖ ┌─┘ │ │ │ │
│ ┌─┴───┤ · ╟─┤ Җ ╟─┘ └────┤ ? ╟─┴─┐ ┌─────────────┘ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │╔════╗╔════╗ │ │
│ │ │ ┌──┴─╖ ┌┐ ┌┐ ┌─┴─╖ ┌─┴─╖ │║ 10 ║║ 32 ║ ┌─────────────────┘ │
│ │ │ │ << ╟─┤├─┬─┤├─┤ · ╟─┤ · ╟─┘╚══╤═╝╚╤═══╝ ┌──┴──┐ │
│ │ │ ╘══╤═╝ └┘ │ └┘ ╘═╤═╝ ╘═╤═╝ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╕ └─┤ ? ╟─┤ · ╟─┤ % ║ │
│ └─────┤ · ╟─┤ · ╟──┤ Ӂ ╟──┤ ɱ ╟─╢ ├───┐ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═╤═╛ ┌─┴─╖ ┌─┴─╖ │ └────────────────────┘
│ └─────┤ │ └───┤ ‼ ╟─┤ ‼ ║ │ ┌──────┐
│ │ │ ╘═══╝ ╘═╤═╝ │ │ ┌────┴────╖
│ │ │ ┌─┴─╖ │ │ │ str→int ║
│ │ └──────────────────────┤ · ╟───┴─┐ │ ╘════╤════╝
│ │ ┌─────────╖ ╘═╤═╝ │ ╔═╧═╗ ┌──┴──┐
│ └──────────┤ int→str ╟──────────┘ │ ║ ║ │ ┌───┴───┐
│ ╘═════════╝ │ ╚═══╝ │ │ ┌───╖ │
└───────────────────────────────────────────────────────┘ │ └─┤ × ╟─┘
┌──────────────┐ ╔═══╗ │ ╘═╤═╝
╔════╗ │ ╓───╖ ┌───╖ │ ┌───╢ 0 ║ │ ┌─┴─╖ ╔═══╗
║ −1 ║ └─╢ Ӝ ╟─┤ × ╟──┴──────┐ │ ╚═╤═╝ └───┤ Ӂ ╟─╢ 0 ║
╚═╤══╝ ╙───╜ ╘═╤═╝ │ │ ┌─┴─╖ ╘═╤═╝ ╚═══╝
┌─┴──╖ ┌┐ ┌───╖ ┌┐ ┌─┴──╖ ╔════╗ │ │ ┌─┤ ╟───────┴───────┐
│ << ╟─┤├─┤ ÷ ╟─┤├─┤ << ║ ║ −1 ║ │ │ │ └─┬─╜ ┌─┐ ┌─────┐ │
╘═╤══╝ └┘ ╘═╤═╝ └┘ ╘═╤══╝ ╚═╤══╝ │ │ │ └───┴─┘ │ ┌─┴─╖ │
│ └─┘ └──────┘ │ │ └───────────┘ ┌─┤ ? ╟─┘
└──────────────────────────────┘ ╓───╖ └───────────────┘ ╘═╤═╝
┌───────────╢ Җ ╟────────────┐ │
┌────────────────────────┴───┐ ╙───╜ │
│ ┌─┴────────────────────┐ ┌─┴─╖
┌─┴─╖ ┌─┴─╖ ┌─┴─┤ · ╟──────────────────┐
│ ♯ ║ ┌────────────────────┤ · ╟───────┐ │ ╘═╤═╝ │
╘═╤═╝ │ ╘═╤═╝ │ │ │ ┌───╖ │
┌─────┴───┘ ┌─────────────────┴─┐ ┌───┴───┐ ┌─┴─╖ ┌─┴─╖ ┌─┤ × ╟─┴─┐
│ │ ┌─┴─╖ │ ┌───┴────┤ · ╟─┤ · ╟──────────┤ ╘═╤═╝ │
│ │ ┌───╖ ┌───╖ ┌──┤ · ╟─┘ ┌─┴─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ ┌────┴─┤ ♭ ╟─┤ × ╟──┘ ╘═╤═╝ │ ┌─┴─╖ ┌───╖└┐ ┌──┴─╖ ┌─┤ · ╟─┘ │
│ │ ╘═══╝ ╘═╤═╝ ┌───╖ │ │ │ × ╟─┤ Ӝ ╟─┴─┤ ÷% ╟─┐ │ ╘═╤═╝ ┌───╖ │
│ ┌─────┴───┐ ┌────┴───┤ Ӝ ╟─┴─┐ │ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ │ │ └───┤ Ӝ ╟─┘
│ ┌─┴─╖ ┌───╖ │ │ ┌────╖ ╘═╤═╝ │ └───┘ ┌─┴─╖ │ │ └────┐ ╘═╤═╝
│ │ × ╟─┤ Ӝ ╟─┘ └─┤ << ╟───┘ ┌─┴─╖ ┌───────┤ · ╟───┐ │ ┌─┴─╖ ┌───╖ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌───┤ + ║ │ ╘═╤═╝ ├──┴─┤ · ╟─┤ × ╟─┘ │
└───┤ └────┐ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │
┌─┴─╖ ┌────╖ │ ║ 0 ╟─┤ ? ╟─┤ = ║ ┌┴┐ │ ║ 0 ╟─┤ ? ╟─┤ = ║ │ │ ┌────╖ │
│ × ╟─┤ << ╟─┘ ╚═══╝ ╘═╤═╝ ╘═╤═╝ └┬┘ │ ╚═══╝ ╘═╤═╝ ╘═╤═╝ │ └─┤ << ╟─┘
╘═╤═╝ ╘═╤══╝ ┌┐ ┌┐ │ │ └───┘ ┌─┴─╖ ├──────┘ ╘═╤══╝
│ └────┤├──┬──┤├─┘ ├─────────────────┤ · ╟───┘ │
│ └┘┌─┴─╖└┘ │ ┌┐ ┌┐ ╘═╤═╝ ┌┐ ┌┐ │
└────────────┤ · ╟─────────┘ ┌─┤├─┬─┤├─┐ └───┤├─┬─┤├────────────┘
╘═╤═╝ │ └┘ │ └┘ │ └┘ │ └┘
└───────────────┘ │ └────────────┘
প্রথম সংস্করণ ব্যাখ্যা
প্রথম সংস্করণটি এন = 7 সমাধান করতে প্রায় এক ঘন্টা সময় নিয়েছিল নীচে বেশিরভাগ ব্যাখ্যা করে যে এই ধীর সংস্করণটি কীভাবে কাজ করেছে। এটি নীচে 10 মিনিটের নিচে নিয়ে যাওয়ার জন্য আমি কী পরিবর্তন করেছি তা আমি নীচে ব্যাখ্যা করব।
বিট মধ্যে একটি ভ্রমণ
এই প্রোগ্রামের বিট প্রয়োজন। এর জন্য প্রচুর পরিমাণে বিট প্রয়োজন এবং এটি সমস্ত সঠিক জায়গায় প্রয়োজন। অভিজ্ঞ ফানসিটন প্রোগ্রামাররা ইতিমধ্যে জানেন যে আপনার যদি এন বিটের প্রয়োজন হয় তবে আপনি সূত্রটি ব্যবহার করতে পারেন
যা ফানসিটনে প্রকাশিত হতে পারে
আমার পারফরম্যান্স অপটিমাইজেশন করার সময়, আমার কাছে ঘটেছিল যে আমি এই সূত্রটি ব্যবহার করে একই মানটি খুব দ্রুত গণনা করতে পারি:
আমি আশা করি আপনি আমাকে ক্ষমা করবেন যে আমি এই পোস্টে সেই অনুযায়ী সমস্ত সমীকরণ গ্রাফিক্স আপডেট করি নি।
এখন, ধরা যাক আপনি বিটের একটি সংকীর্ণ ব্লক চান না; আসলে, যদি আপনি চান এন নিয়মিত সময় অন্তর প্রত্যেক এ বিট ট -th বিট মত তাই হয়:
LSB
↓
00000010000001000000100000010000001
└──┬──┘
k
আপনি এটি জানার পরে এর সূত্রটি মোটামুটি সোজা-এগিয়ে রয়েছে:
কোডে, ফাংশনটি n এবং k এরӜ
মান নেয় এবং এই সূত্রটি গণনা করে।
ব্যবহৃত সংখ্যা ট্র্যাক করা
আছে এন চূড়ান্ত গ্রিড ² এর সংখ্যা, এবং প্রতিটি সংখ্যা কোনো হতে পারে এন সম্ভাব্য মান। প্রতিটি ঘরে কোন সংখ্যার অনুমতি রয়েছে তা ট্র্যাক করার জন্য, আমরা n ³ বিট সমন্বিত একটি সংখ্যা বজায় রাখি, যাতে একটি নির্দিষ্ট মান নেওয়া হয়েছে তা নির্দেশ করার জন্য কিছুটা সেট করা থাকে। প্রাথমিকভাবে এই সংখ্যাটি 0, স্পষ্টতই।
অ্যালগরিদম নীচে ডান কোণে শুরু হয়। "অনুমান" করার পরে প্রথম সংখ্যাটি 0 হয়, আমাদের এই সত্যটি ট্র্যাক করে রাখতে হবে যে 0 একই কোষে একই সারি, কলাম এবং তির্যক বরাবর অনুমোদিত নয়:
LSB (example n=5)
↓
10000 00000 00000 00000 10000
00000 10000 00000 00000 10000
00000 00000 10000 00000 10000
00000 00000 00000 10000 10000
10000 10000 10000 10000 10000
↑
MSB
এই লক্ষ্যে, আমরা নিম্নলিখিত চারটি মান গণনা করি:
বর্তমান সারি: আমাদের প্রতি n- তম বিট (প্রতি সেল প্রতি এক) n বিট প্রয়োজন , এবং তারপরে এটিকে বর্তমান সারি আর-এ স্থানান্তর করুন , প্রতিটি সারি মনে রাখে n ² বিট রয়েছে :
বর্তমান কলাম: আমাদের প্রতিটি এন th-th বিট (প্রতি সারি প্রতি একটি) n বিট দরকার , এবং তারপরে এটি বর্তমান কলামে সি-এ স্থানান্তর করুন , প্রতিটি কলামে এন বিট রয়েছে মনে করে :
ফরোয়ার্ড ডায়াগোনাল: আমাদের প্রতিটি এন বিট দরকার ... (আপনি কি মনোযোগ দিয়েছিলেন? তাড়াতাড়ি, এটি বের করে ফেলুন!) ... এন ( এন +1) -বিট (ভাল হয়েছে!) তবে কেবল যদি আমরা আসলেই থাকি এগিয়ে তির্যক:
পিছনের তির্যক: এখানে দুটি জিনিস। প্রথমত, আমরা কীভাবে জানব যে আমরা পিছনের তির্যকটিতে আছি? গাণিতিকভাবে, অবস্থাটি সি = ( এন - 1) - আর , যা সি = এন + (- আর - 1) এর সমান । আরে, এটা কি আপনাকে কিছু মনে করিয়ে দেয়? এটি ঠিক, এটি দুটির পরিপূরক, সুতরাং হ্রাসের পরিবর্তে আমরা বিটওয়াইজ নেগেশন (ফানসিটনে খুব দক্ষ) ব্যবহার করতে পারি। দ্বিতীয়ত, উপরের সূত্রটি ধরে নিয়েছে যে আমরা কমপক্ষে তাত্পর্যপূর্ণ বিট সেট করতে চাই, তবে পশ্চাদপথ ত্রিভুজের মধ্যে আমরা তা করি না, তাই আমাদের এটিকে স্থানান্তরিত করতে হবে ... জানেন কি? ... ঠিক আছে, এন ( এন - 1)।
এটিই কেবলমাত্র একটি যেখানে আমরা সম্ভাব্যভাবে 0 দ্বারা n = 1 বিভক্ত করি তবে ফানসিটনের কোনও যত্ন নেই। 0 ÷ 0 কেবল 0, আপনি জানেন না?
কোডে, ফাংশনটি Җ
(নীচের অংশে) n এবং একটি সূচক নেয় (যা থেকে এটি বিভাজন এবং বাকী দ্বারা r এবং c গণনা করে), এই চারটি মান গণনা করে এবং or
সেগুলি একসাথে s করে।
ব্রুট ফোর্স অ্যালগরিদম
ব্রুট-ফোর্স অ্যালগরিদম Ӂ
(শীর্ষে ফাংশন) দ্বারা প্রয়োগ করা হয় । এটি এন (গ্রিডের আকার), সূচক (যেখানে গ্রিডে আমরা বর্তমানে একটি সংখ্যা রাখছি ) লাগে , এবং নেওয়া হয় ( n ³ বিট সহ সংখ্যাটি আমাদের জানায় যে আমরা প্রতিটি ঘরে এখনও কোন সংখ্যা রাখতে পারি)।
এই ফাংশনটি স্ট্রিংয়ের ক্রম দেয় returns প্রতিটি স্ট্রিং গ্রিডের একটি সম্পূর্ণ সমাধান। এটি সম্পূর্ণ সমাধানকারী; আপনি যদি এটি ছেড়ে দেন তবে এটি সমস্ত সমাধান ফিরিয়ে দেবে, তবে এটি তাদের অলস-মূল্যায়িত ক্রম হিসাবে ফিরিয়ে দেয়।
যদি সূচক 0-এ পৌঁছে যায়, আমরা সফলভাবে পুরো গ্রিডটি পূরণ করেছি, তাই আমরা খালি স্ট্রিং (কোনও একক সমাধান যা কোনও কক্ষকে আচ্ছাদন করে না) যুক্ত একটি ক্রম ফিরিয়ে দিয়েছি। খালি স্ট্রিংটি হ'ল 0
এবং আমরা লাইব্রেরির ফাংশনটি এটিকে ⌑
একটি একক-উপাদান ক্রমিকায় পরিণত করতে ব্যবহার করি ।
নীচে কর্মক্ষমতা উন্নতির অধীনে বর্ণিত চেকটি এখানে ঘটে।
যদি সূচকটি এখনও 0-এ পৌঁছায় না, আমরা এখন সূচকটি পেতে 1 হ্রাস করেছিলাম যেখানে আমাদের এখন একটি নম্বর রাখতে হবে (কল করুন যে ix )।
আমরা ♫
0 থেকে n - 1 পর্যন্ত মানগুলি সহ অলস ক্রম উত্পন্ন করতে ব্যবহার করি ।
তারপরে আমরা ɓ
একটি ল্যাম্বডা (মোনাডিক বাইন্ড) ব্যবহার করি যা নিম্নলিখিতগুলি যথাযথভাবে করে:
- প্রাসঙ্গিক বিট প্রথমেই দেখ নেয়া সিদ্ধান্ত নিতে সংখ্যা এখানে বা বৈধ নয় কিনা। আমরা একটি সংখ্যা স্থাপন করতে পারেন আমি যদি এবং কেবল যদি নিয়ে যাওয়া & (1 << ( এন × IX ) << আমি ) ইতিমধ্যে সেট করা নেই। যদি এটি সেট করা থাকে, ফিরে
0
(ফাঁকা ক্রম)
Җ
বর্তমান সারি, কলাম এবং তির্যক (গুলি) এর সাথে সম্পর্কিত বিট গণনা করতে ব্যবহার করুন । এটি আমি দ্বারা শিফট করুন এবং তারপরে or
এটি নেওয়া হবে ।
Ӂ
অবশিষ্ট কোষগুলির জন্য সমস্ত সমাধান পুনরুদ্ধার করতে পুনরায় কল করুন , এটি নতুন নেওয়া এবং হ্রাস ix পেরিয়ে । এটি অসম্পূর্ণ স্ট্রিংগুলির একটি ক্রম দেয়; প্রতিটি স্ট্রিংয়ের ix অক্ষর রয়েছে (গ্রিডটি সূচী ix পর্যন্ত পূর্ণ )।
ɱ
এইভাবে পাওয়া সমাধানগুলিতে যেতে ম্যাপ (মানচিত্র) ব্যবহার করুন এবং প্রতিটিটির শেষে আমি সম্মতি ‼
জানাতে ব্যবহার করুন । সূচকটি এন এর একাধিক হলে একটি নতুন লাইন যুক্ত করুন , অন্যথায় একটি স্থান।
ফলাফল তৈরি হচ্ছে
প্রধান প্রোগ্রাম কল করে Ӂ
(ব্রুট ফরসার) এন , ইনডেক্স = এন with (মনে রাখবেন আমরা গ্রিডটি পিছনের দিকে পূরণ করেছি) এবং নেওয়া = 0 (প্রাথমিকভাবে কিছুই নেওয়া হয় না)। যদি এর ফলাফলটি খালি অনুক্রম হয় (কোনও সমাধান পাওয়া যায় নি), খালি স্ট্রিংটিকে আউটপুট করুন। অন্যথায়, অনুক্রমের প্রথম স্ট্রিং আউটপুট। দ্রষ্টব্য যে এর অর্থ এটি ক্রমের কেবলমাত্র প্রথম উপাদানটি মূল্যায়ন করবে, যার কারণেই সমাধানটি সমস্ত সমাধান না পাওয়া পর্যন্ত সমাধান চালিয়ে যায় না।
কর্মক্ষমতা বৃদ্ধি
(যারা ইতিমধ্যে ব্যাখ্যাটির পুরাতন সংস্করণটি পড়েছেন তাদের জন্য: প্রোগ্রামটি আর ক্রমের ক্রম তৈরি করে না যা আলাদাভাবে আউটপুটের জন্য একটি স্ট্রিংয়ে রূপান্তরিত করা দরকার; এটি কেবল স্ট্রিংগুলির একটি ক্রম সরাসরি তৈরি করে I've আমি সেই অনুসারে ব্যাখ্যাটি সম্পাদনা করেছি I've । তবে এটি মূল উন্নতি ছিল না Here এটি এখানে আসে))
আমার মেশিনে, প্রথম সংস্করণের সংকলিত এক্সটি এন = 7 সমাধান করতে ঠিক 1 ঘন্টা সময় নিয়েছিল এটি 10 মিনিটের প্রদত্ত সময়সীমার মধ্যে ছিল না, তাই আমি বিশ্রাম নিই নি। (ভাল, আসলে, আমি বিশ্রাম না করার কারণটি ছিল যে কীভাবে এটির গতি বাড়ানো যায় সে সম্পর্কে আমার এই ধারণা ছিল।)
উপরে বর্ণিত অ্যালগরিদমটি তার অনুসন্ধানটি থামিয়ে দেয় এবং প্রতিবার ব্যাকট্র্যাক হয় যে এটি এমন একটি ঘরের সাথে মুখোমুখি হয় যেখানে নেওয়া সংখ্যার সমস্ত বিট সেট করা থাকে যা ইঙ্গিত করে যে এই কক্ষে কিছুই রাখা যাবে না।
যাইহোক, অ্যালগরিদম অব্যাহত থাকবে futilely গ্রিড পূরণ করতে পর্যন্ত সেল যা ঐ সমস্ত বিট সেট করা হয়। এটি আরও দ্রুত হবে যদি এটি ইতিমধ্যে যে কোনও এখনও পূরণযোগ্য-পূর্ণ ঘরটিতে ইতিমধ্যে সমস্ত বিটস সেট থাকে, যা ইতিমধ্যে ইঙ্গিত দেয় যে আমরা যত নম্বরই রাখি না কেন বাকি গ্রিডটি আমরা কখনই সমাধান করতে পারি না much এটা। তবে আপনি কীভাবে কোনও দক্ষতার সাথে পরীক্ষা করতে পারেন যে কোনও কোষের সমস্ত এনটাইটেল ব্যতীত তার এন বিট সেট আছে কিনা ?
কৌশলটি নেওয়া সংখ্যায় ঘরে প্রতি একক বিট যোগ করে শুরু হয় । উপরে যা দেখানো হয়েছিল তার পরিবর্তে এখন এটি দেখতে দেখতে এটি:
LSB (example n=5)
↓
10000 0 00000 0 00000 0 00000 0 10000 0
00000 0 10000 0 00000 0 00000 0 10000 0
00000 0 00000 0 10000 0 00000 0 10000 0
00000 0 00000 0 00000 0 10000 0 10000 0
10000 0 10000 0 10000 0 10000 0 10000 0
↑
MSB
N Instead এর পরিবর্তে, এখন এই সংখ্যায় n ² ( n + 1) বিট রয়েছে। বর্তমান সারি / কলাম / তির্যককে জনপ্রিয় করে ফাংশনটি সেই অনুযায়ী পরিবর্তন করা হয়েছে (আসলে, সৎ হওয়ার জন্য সম্পূর্ণ পুনরায় লেখা)। এই ফাংশনটি এখনও প্রতি সেল কেবলমাত্র n বিটগুলি তৈরি করবে , সুতরাং আমরা কেবল অতিরিক্ত অতিরিক্ত বিট যোগ করব 0
।
এখন, ধরা যাক আমরা গণনার অর্ধেক পথ পেরিয়ে এসেছি, আমরা সবেমাত্র একটি 1
মাঝারি কক্ষে রেখেছি, এবং নেওয়া নম্বরটি দেখতে এরকম কিছু দেখাচ্ছে:
current
LSB column (example n=5)
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0
00011 0 11110 0 01101 0 11101 0 11100 0
11111 0 11110 0[11101 0]11100 0 11100 0 ← current row
11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
↑
MSB
আপনি দেখতে পাচ্ছেন, উপরের-বাম ঘর (সূচক 0) এবং মাঝের-বাম ঘর (সূচি 10) এখন অসম্ভব। আমরা কীভাবে সর্বাধিক দক্ষতার সাথে এটি নির্ধারণ করব?
এমন একটি সংখ্যা বিবেচনা করুন যাতে প্রতিটি ঘরের 0 তম বিট সেট করা থাকে তবে কেবল বর্তমান সূচী পর্যন্ত। পরিচিত সূত্রটি ব্যবহার করে এই জাতীয় সংখ্যা গণনা করা সহজ:
আমরা যদি এই দুটি সংখ্যা একসাথে যুক্ত করি তবে আমরা কী পেতে পারি?
LSB LSB
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0 10000 0 10000 0 10000 0 10000 0 10000 0 ╓───╖
00011 0 11110 0 01101 0 11101 0 11100 0 ║ 10000 0 10000 0 10000 0 10000 0 10000 0 ║
11111 0 11110 0 11101 0 11100 0 11100 0 ═══╬═══ 10000 0 10000 0 00000 0 00000 0 00000 0 ═════ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ║ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 00000 0 00000 0 00000 0 00000 0 00000 0 o
↑ ↑
MSB MSB
ফলাফল হলো:
OMG
↓
00000[1]01010 0 11101 0 00010 0 00011 0
10011 0 00001 0 11101 0 00011 0 00010 0
═════ 00000[1]00001 0 00011 0 11100 0 11100 0
═════ 11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
আপনি দেখতে পাচ্ছেন যে অতিরিক্ত যোগ হয়েছে আমাদের অতিরিক্ত সংযোজন যা অতিরিক্ত যুক্ত হয়েছে, তবে কেবলমাত্র সেই ঘরের জন্য সমস্ত বিট সেট করা থাকলে! অতএব, যা করার বাকি তা হ'ল those বিটগুলি (উপরের মতো একই সূত্র, তবে << এন ) মাস্ক করা এবং ফলাফলটি 0:
00000[1]01010 0 11101 0 00010 0 00011 0 ╓╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓─╖ ╓───╖
10011 0 00001 0 11101 0 00011 0 00010 0 ╓╜╙╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓╜ ╙╖ ║
00000[1]00001 0 00011 0 11100 0 11100 0 ╙╥╥╜ 00000 1 00000 1 00000 0 00000 0 00000 0 ═════ ║ ║ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ╓╜╙╥╜ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╙╖ ╓╜ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 ╙──╨─ 00000 0 00000 0 00000 0 00000 0 00000 0 ╙─╜ o
যদি এটি শূন্য না হয় তবে গ্রিডটি অসম্ভব এবং আমরা থামতে পারি।
- এন = 4 থেকে 7 এরসমাধান এবং চলমান সময় দেখায় স্ক্রিনশট ।