নীচের শ্রেণিতে বৃহত্তর ছাপ ফেলে এমন বাস্তব-জগতের অ্যালগরিদমগুলি কি বিদ্যমান? [বন্ধ]


39

গত রাতে আমি অন্য প্রোগ্রামার সাথে আলোচনা করছিলাম যে কিছু O (1) হতে পারে তবে ও (1) অ্যালগোরিদমে বড় ধ্রুবক থাকলে ও (এন) এমন একটি অপারেশন এটি ছাড়িয়ে যেতে পারে। সে দ্বিমত পোষণ করেছে, তাই আমি এখানে এনেছি।

এখানে কি অ্যালগরিদমের উদাহরণ রয়েছে যা নীচের শ্রেণিতে রয়েছে তাদেরকে ছাড়িয়ে যায়? উদাহরণস্বরূপ, ও (এন) ও (1) এর চেয়ে দ্রুত বা ও (এন 2 ) ও (এন) এর চেয়ে দ্রুত হওয়া।

গাণিতিকভাবে এটি অ্যাসিপটোটিক উপরের সীমানা সহ কোনও ফাংশনের জন্য প্রদর্শিত হতে পারে, যখন আপনি ধ্রুবক কারণগুলি উপেক্ষা করেন, কিন্তু বন্যের মধ্যে কি এই জাতীয় অ্যালগরিদম রয়েছে? এবং আমি তাদের উদাহরণ কোথায় পাবেন? তারা কোন ধরণের পরিস্থিতিতে ব্যবহার হয়?


15
এমনকি "বড়" অ্যালগরিদমের জন্যও ছোট অগত্যা আরও ভাল নয়। উদাহরণস্বরূপ, গাউসিয়ান নির্মূলকরণ হ'ল ও (এন ^ 3), তবে এমন অ্যালগরিদম রয়েছে যা এটি ও (এন ^ 2) এ করতে পারে তবে চতুর্ভুজ সময়কালের সহগ এতই বিশাল যে লোকেরা কেবল ও (এন ^) এর সাথে যায় people 3) এক।
ব্ল্যাকজ্যাক

11
এটিকে একটি বুদ্ধিমান প্রশ্ন করার জন্য আপনাকে "... রিয়েল-ওয়ার্ল্ড সমস্যার জন্য" বা এই জাতীয় কিছু যুক্ত করতে হবে। অন্যথায় আপনার কেবল nধ্রুবকটির জন্য ক্ষতিপূরণ করার জন্য যথেষ্ট বড় করা প্রয়োজন (এটি বিগ-ও স্বরলিপিটির মূল বিষয়)।
স্টার ব্লু

8
গতির জন্য বড়-ও স্বরলিপি নেবেন না।
কোডিজম

16
বড়-ও স্বরলিপিটির বিন্দুটি আপনাকে বলতে হয় না যে একটি অ্যালগোরিদম কত দ্রুত চলে, তবে এটি কতটা ভালভাবে স্কেল করে।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

4
আমি অবাক হয়েছি কেউ এলপিতে সমাধানের জন্য সিম্প্লেক্স অ্যালগরিদমের উল্লেখ করেনি। লিনিয়ার প্রত্যাশিত রান-টাইমের সাথে এটির একটি ক্ষতিকারক সবচেয়ে খারাপ পরিস্থিতি রয়েছে। অনুশীলনে, এটি বেশ দ্রুত। এটি এমন একটি সমস্যা তৈরি করা তুচ্ছ যেটি রান-টাইমের সবচেয়ে খারাপ পরিস্থিতিও প্রদর্শন করে। এছাড়াও, এটি ভারী ব্যবহৃত হয়।
ccoakley

উত্তর:


45

খুব ছোট, স্থির ডেটা টেবিলগুলিতে সন্ধান করা। একটি অনুকূলিত হ্যাশ টেবিলটি ও (1) হতে পারে এবং হ্যাশ গণনার ব্যয়ের কারণে বাইনারি অনুসন্ধান বা এমনকি লিনিয়ার অনুসন্ধানের চেয়ে ধীরে ধীরে ধীর হতে পারে slow


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

2
আমি লরেন পেচটেলের উত্তর এবং স্টিভ 314 এর প্রথম মন্তব্য পছন্দ করি। আমি আসলে এটি ঘটতে দেখেছি। যদি আপনি একটি জাভা ক্লাস তৈরি করেন যার একটি হ্যাশকোড () পদ্ধতি রয়েছে যা হ্যাশ মানটি ফেরত পেতে খুব বেশি সময় নেয় (এবং এটি ক্যাশে করতে পারে না / করতে পারে না), তবে হ্যাশ-টাইপ সংকলনে যেমন শ্রেণীর উদাহরণ ব্যবহার করে (যেমন হ্যাশসেট) সংগ্রহটি অ্যারে-টাইপ সংগ্রহের (অ্যারেলিস্টের মতো) তুলনায় অনেক বেশি ধীর করে দেবে।
শিবান ড্রাগন

1
@ স্টিভ 314: কেন আপনি হ্যাশ ফাংশনগুলি ও (এম) ধরে রাখছেন যেখানে এম কী এর আকার? হ্যাশ ফাংশনগুলি ও (1) হতে পারে এমনকি যদি আপনি স্ট্রিং (বা অন্যান্য জটিল ধরণের) নিয়ে কাজ করে থাকেন। এটিকে আনুষ্ঠানিক সংজ্ঞাতে রাখার মতো খুব বেশি মূল্য নেই হ্যাশ ফাংশনটি উপলব্ধি করে জটিলতার পরিবর্তনটি উল্লেখযোগ্যভাবে পরিবর্তন করতে পারে যদি আপনার ইনপুটটির জন্য কোনও ভুল ডেটা স্ট্রাকচার (হ্যাশ টেবিল) বেছে নেওয়া হয় (কী আকারটি অনির্দেশ্য)।
কোডিজম

1
@ স্টিভ 314: নোট করুন যে আমি নির্দিষ্ট ডাটা সারণী বলেছি। তারা বড় হয় না। এছাড়াও, কোনও হ্যাশ টেবিল থেকে আপনি কেবল ও (1) পারফরম্যান্স পাবেন যদি আপনি কোনও সংঘর্ষ না হয় তা নিশ্চিত করার জন্য কীটি অনুকূলিত করতে পারেন।
লরেন পেচটেল

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

25

ম্যাট্রিক্সের গুণ ভ্রান্ত ও (এন ^ 3) অ্যালগরিদম প্রায়শই ছোট-ইশ ম্যাট্রিক্সের জন্য স্ট্রেসনের ও (এন ^ 2.8) এর চেয়ে দ্রুততর অনুশীলনে ব্যবহৃত হয়; এবং স্ট্র্যাসেন এর ও (এন ^ 2.3) এর পরিবর্তে বৃহত্তর ম্যাট্রিকগুলির জন্য ব্যবহৃত হয় pers



2
কপারস্মিথ-উইনোগ্রাড কখনও ব্যবহৃত হয় না। এটি প্রয়োগ করা নিজের মধ্যে একটি ভয়াবহ কাজ হবে এবং ধ্রুবকটি এতটাই খারাপ যে এটি আধুনিক বৈজ্ঞানিক ম্যাট্রিক্স সমস্যার জন্যও অপ্রয়োজনীয় হবে।
tskuzzy

24

একটি সাধারণ উদাহরণ হ'ল বিভিন্ন বাছাই করা অ্যালগরিদমের মধ্যে পার্থক্য। মার্জোর্ট, হিপসোর্ট এবং আরও কিছু হ'ল ও (এন লগ এন) । কুইকসোর্ট হ'ল ও (এন ^ 2) সবচেয়ে খারাপ পরিস্থিতি। তবে প্রায়শই কুইকসোর্ট দ্রুত হয় এবং বাস্তবে এটি ও (এন লগ এন) এর মতো গড় সম্পাদন করে । আরও তথ্য

আরেকটি উদাহরণ হ'ল একক ফিবোনাচি সংখ্যার প্রজন্ম। পুনরাবৃত্ত অ্যালগরিদম হল ও (এন) , ম্যাট্রিক্স-ভিত্তিক অ্যালগরিদম ও (লগ এন) । তবুও, হাজার হাজার ফিবোনাচি সংখ্যার প্রথম কয়েকটির জন্য, পুনরাবৃত্তির অ্যালগোরিদম সম্ভবত আরও দ্রুত। এটি অবশ্যই বাস্তবায়নের উপর নির্ভর করে!

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


এটি বিগ-ও-এর একটি দুর্দান্ত ব্যাখ্যা, তবে প্রশ্নের মাংসকে সম্বোধন করতে ব্যর্থ হয়েছে, এটি নির্দিষ্ট ক্ষেত্রে যেখানে কোনও ও (এন) অ্যালগোরিদম একটি ও (1) এর চেয়ে দ্রুত হবে।
KyleWpppd

এক নম্বর ফিবোনাচি কিছুটা বন্ধ। আউটপুট আকার ইনপুট আকারে সূচকীয়, সুতরাং এটি ও (lg n * e e n) বনাম ও (lg lg n * e ^ n) এর মধ্যে পার্থক্য।
পিটার টেলর

সংযোজন: সেরা। ম্যাট্রিক্স-ভিত্তিক অ্যালগরিদম 1.5 ^ n এর ক্রম অনুসারে সংখ্যার সাথে সংখ্যাবৃদ্ধি করে, সুতরাং O (lg lg n * ne ^ n) সেরা বাঁধা প্রমাণযোগ্য হতে পারে।
পিটার টেলর

1
কুইকসোর্টকে সাধারণত ও (এন লগ এন) প্রত্যাশিত পারফরম্যান্স হিসাবে বর্ণনা করা হয় - সবচেয়ে খারাপ পরিস্থিতি এলোমেলো ইনপুটগুলির পক্ষে বেশ সম্ভাবনা, এবং একটি প্রিপাসে বা পিভট নির্বাচনের ক্ষেত্রে কিছুটা এলোমেলোভাবে গড়ার অর্থ হল সবচেয়ে খারাপ ক্ষেত্রে সামগ্রিকভাবে উল্লেখযোগ্য ইনপুট মাপের জন্য খুব অসম্ভব। সবচেয়ে খারাপ ঘটনাটি কুইকোর্ট (১) খুব সাধারণ এবং (২) খুব ক্যাশে-বান্ধব, এর চেয়ে কম প্রাসঙ্গিক, উভয়ই অন্যান্য অনেক বাছাই করা অ্যালগরিদমের তুলনায় উল্লেখযোগ্যভাবে আরও ভাল ধ্রুবক কারণগুলির দিকে পরিচালিত করে।
স্টিভ 314

(২) হ'ল বিগ-ও পারফরম্যান্সের দিকে তাকানোর সময় অবশ্যই বাহ্যিক বিবেচনার ধরণটি বিবেচনায় নেওয়া উচিত। অ্যালগরিদমভাবে, মার্জেসোর্টের সর্বদা কুইকসোর্টকে ছাড়িয়ে নেওয়া উচিত , তবে সম্পদ ব্যবহার এবং ক্যাশে লোকাল সাধারণত তাদের বাস্তব-বিশ্বের পারফরম্যান্সের অবস্থানগুলিকে বিপরীত করে দেয়।
ড্যান লিয়ন্স

18

দ্রষ্টব্য: দয়া করে নীচে @ ব্যাক 2 ডস এবং অন্যান্য গুরু দ্বারা মন্তব্যগুলি পড়ুন, কারণ তারা আমার লেখার চেয়ে বাস্তবে আরও সহায়ক - সমস্ত অবদানকারীদের জন্য ধন্যবাদ।

আমি নীচের চার্টটি থেকে মনে করি (এর থেকে নেওয়া: বড় ও স্বরলিপি , "অ্যালগোরিদমগুলির নিরাশাপূর্ণ প্রকৃতি:" অনুসন্ধান করুন) আপনি দেখতে পাচ্ছেন যে (লগ এন) সর্বদা ও (এন) বলার চেয়ে ভাল হয় না । সুতরাং, আমার ধারণা আপনার যুক্তিটি বৈধ is

Pic-1


6
প্রশ্নটি অ্যালগরিদমের নির্দিষ্ট বাস্তব বিশ্বের উদাহরণ চেয়েছিল। এটি যেমন দাঁড়িয়ে আছে তেমন কোনও নেই।
মেগান ওয়াকার

19
আপনি সেই গ্রাফটিতে কিছুই দেখতে পারবেন না, যা প্রশ্নের উত্তর দেবে। এটি বিভ্রান্তিকর। এই গ্রাফ নিছক ফাংশন প্লট বরাদ্দ y = 1, y = log x, এবং তাই এবং ছেদ y = 1এবং y = xআসলে বিন্দু (1,1)। এটি যদি সত্যিই সঠিক হয় তবে এটি আপনাকে বলার অপেক্ষা রাখে না যে উচ্চতর জটিলতার অ্যালগোরিদমগুলি 0 থেকে 2 টি এন্ট্রিগুলির পক্ষে দ্রুততর হতে পারে, এটি এমন কিছু বিষয় যা লোক খুব কমই যত্ন করে। গ্রাফটি কীভাবে বিবেচনায় নিতে পুরোপুরি ব্যর্থ হয় (এবং প্রশ্নে অনুধাবনযোগ্য পারফরম্যান্সের পার্থক্যটি কী থেকে আসে) ধ্রুব কারণগুলি।
back2dos

@ সামুয়েল ওয়াকার, মন্তব্যের জন্য ধন্যবাদ। প্রদত্ত লিঙ্কটিতে (লিংক -১) বিভাগে অ্যালগরিদমের কয়েকটি উদাহরণ রয়েছে।
NoChance

5
@ back2dos: নিজের গ্রাফটি প্রশ্নের উত্তর দেয় না, তবে এর উত্তর দেওয়ার জন্য ব্যবহার করা যেতে পারে। প্রতিটি প্রদর্শিত ফাংশনের আকৃতি যে কোনও স্কেল এবং ধ্রুবক ফ্যাক্টরের জন্য একই। এটির সাহায্যে গ্রাফটি দেখায় যে প্রদত্ত ফাংশনগুলির সংমিশ্রণে, বিভিন্ন ইনপুট রয়েছে যার জন্য একটি ছোট এবং ইনপুটগুলির একটি পরিসীমা রয়েছে যার জন্য অপরটি।
জানু হুডেক

2
@ উদ্যান_ ওয়াটারওয়ার্থ, আপনি ঠিক বলেছেন, আমি এই বিষয়টিটি স্বীকার করব এবং সেই মন্তব্যটি সরিয়ে দেব। তবুও, উত্তর দুটি ক্ষেত্রে ভুল বা বিভ্রান্তিকর: 1) বিগ-ও এর পুরো বিষয়টিটি এটি জটিলতার উপর একটি উচ্চতর আবদ্ধ দেয়; এটি বৃহত্তর এন এর জন্য কেবলমাত্র অর্থবহ কারণ আমরা স্পষ্টতই ছোট শর্তগুলি টস করি যা এন বাড়ার সাথে সাথে সবচেয়ে বড় শব্দটি দ্বারা অভিভূত হয়। 2) প্রশ্নের মূল বিষয়টি দুটি অ্যালগরিদমের উদাহরণগুলি সন্ধান করা যেখানে উচ্চ বিগ-ওযুক্ত একটি নিম্ন সীমানার সাথে একটিকে ছাপিয়ে যায়। এই উত্তরটি ব্যর্থ হয়েছে কারণ এটি এরকম কোনও উদাহরণ দেয় না।
কালেব

11

হ্যাঁ এর ব্যবহারিক মান জন্য n। সিএস তত্ত্বে এটি অনেকটা সামনে আসে। প্রায়শই একটি জটিল অ্যালগরিদম থাকে যা প্রযুক্তিগতভাবে আরও-ও-পারফরম্যান্সের সাথে উন্নত হয়, তবে অবিচ্ছিন্ন কারণগুলি ধ্রুবক কারণগুলি এত বড়।

আমার একবার আমার গণ্য জ্যামিতির অধ্যাপক লিনিয়ার সময়ে বহুভুজকে ত্রিভঙ্গীকরণের জন্য একটি অ্যালগরিদম বর্ণনা করেছিলেন তবে তিনি "অত্যন্ত জটিল" বলে শেষ করেছেন বলে আমি মনে করি না যে কেউ আসলে এটি বাস্তবায়ন করেছে "(!!)।

এছাড়াও, ফিবোনাচি হিপগুলির স্বাভাবিক গাদাগুলির চেয়ে ভাল বৈশিষ্ট্য রয়েছে তবে এটি খুব জনপ্রিয় নয় কারণ এগুলি নিয়মিত গাদা হিসাবে অনুশীলনে খুব ভাল সম্পাদন করে না । এটি অন্যান্য অ্যালগরিদমগুলিতে কাসকেড করতে পারে যা হিপগুলি ব্যবহার করে - উদাহরণস্বরূপ, ডিজকস্ট্রার সংক্ষিপ্ততম পাথগুলি ফাইবোনাকির গাদা দিয়ে গাণিতিকভাবে দ্রুত হয়, তবে সাধারণত অনুশীলনে হয় না।


এটি 100,000 বা এর মতো শীর্ষ দিকের ক্রমে বিশাল গ্রাফগুলির জন্য দ্রুত।
tskuzzy

ফিবোনাচি হিপগুলি আমার প্রথম (প্রকৃতপক্ষে, দ্বিতীয়) হিসাবেও চিন্তা করেছিল।
কনরাড রুডল্ফ

10

কোনও লিঙ্কযুক্ত তালিকায় সন্নিবেশ করানো এবং একটি পুনরায় আকারযুক্ত অ্যারেতে প্রবেশের তুলনা করুন।

লিঙ্কযুক্ত তালিকা ও (1) সন্নিবেশ সার্থক হওয়ার জন্য ডেটাগুলির পরিমাণ মোটামুটি বড় হতে হবে।

একটি লিঙ্কযুক্ত তালিকায় পরবর্তী পয়েন্টার এবং ডিসেরেন্সগুলির জন্য অতিরিক্ত ওভারহেড থাকে। একটি আকার পরিবর্তনযোগ্য অ্যারে প্রায় ডেটা অনুলিপি করতে হয়। সেই অনুলিপিটি হ'ল (এন), তবে অনুশীলনে খুব দ্রুত।


1
প্রতিবার আকারের আকারে এটি পূরণ করার সময় দ্বিগুণ করা হয়, সুতরাং প্রতি সন্নিবেশে পুনঃনির্মাণের গড় ব্যয় হ'ল ও (1)।
কেভিন ক্লাইন

2
@ কেভিঙ্কলাইন, হ্যাঁ তবে ও (এন) সন্নিবেশ পয়েন্টের পরে সমস্ত উপাদান সরিয়ে নিয়ে আসে। বরাদ্দটি হে (1) বার অনুমিত হয়। আমার বক্তব্যটি হল যে আন্দোলনটি এখনও খুব দ্রুত, তাই অনুশীলনে সাধারণত লিঙ্কযুক্ত তালিকে মারধর করা হয়।
উইনস্টন ইওয়ার্ট

সংযুক্ত তালিকার তুলনায় সংক্ষিপ্ত অ্যারেগুলি এত দ্রুত হওয়ার কারণটি প্রসেসর ক্যাশিংয়ের কারণে। একটি লিঙ্কযুক্ত তালিকাগুলি অনুসরণ করে প্রতিটি উপাদানকে ক্যাশে মিস করতে হবে। উভয় বিশ্বের সেরা পেতে আপনার একটি অনিবন্ধিত লিঙ্কযুক্ত তালিকা ব্যবহার করা উচিত ।
ড্যান_ওয়াটারওয়ার্থ

পরিবর্তনযোগ্য অ্যারেগুলি সর্বদা অনুলিপি করে না। এটি নির্ভর করে যে এটি কী চলছে এবং এর পথে কিছু আছে কিনা। দ্বিগুণ আকারের জন্য একই, বাস্তবায়ন নির্দিষ্ট। রোল ওভার রোল ওভার জিনিস যদিও সমস্যা। লিঙ্কযুক্ত তালিকাগুলি সাধারণত অজানা আকারের সারিগুলির জন্য সেরা তবে রোটারি বাফাররা তাদের অর্থের জন্য কাতারে একটি রান দেয়। অন্যান্য ক্ষেত্রে লিঙ্কযুক্ত তালিকাগুলি দরকারী কারণ বরাদ্দ বা সম্প্রসারণ কেবল আপনাকে সমস্ত সময় সামঞ্জস্যপূর্ণ জিনিস রাখতে দেয় না যাতে আপনার কোনও পয়েন্টারের প্রয়োজন হয়।
jgmjgm

@ jgmjgm, আপনি যদি একটি আকার পরিবর্তনযোগ্য অ্যারের মাঝখানে sertোকান, এটি একেবারে এর পরে উপাদানগুলি অনুলিপি করে।
উইনস্টন এওয়ার্ট

8

বিগ-ওহ স্বরলিপিটি কোনও ফাংশনের বৃদ্ধির হার বর্ণনা করতে ব্যবহৃত হয়, সুতরাং এটি সম্ভব যে কোনও হে (1) অ্যালগরিদম দ্রুততর হবে তবে কেবলমাত্র একটি নির্দিষ্ট বিন্দুর (ধ্রুবক ফ্যাক্টর) অবধি।

সাধারণ স্বরলিপি:

ও (1) - পুনরাবৃত্তির সংখ্যা (কখনও কখনও আপনি এটি ফাংশন দ্বারা ব্যয়কৃত ব্যবহারকারী-সময় হিসাবে উল্লেখ করতে পারেন) ইনপুটটির আকারের উপর নির্ভর করে না এবং বাস্তবে ধ্রুবক হয়।

ও (এন) - পুনরাবৃত্তির সংখ্যা ইনপুট আকারের লিনিয়ার অনুপাতে বৃদ্ধি পায় । অর্থ - যদি অ্যালগরিদম কোনও ইনপুট N, 2 * N বারের মাধ্যমে পুনরাবৃত্তি করে তবে এটি ও (এন) হিসাবে বিবেচিত হয়।

ও (এন ^ 2) (চতুর্ভুজ) - পুনরাবৃত্তির সংখ্যা হ'ল ইনপুট আকার বর্গক্ষেত্র।


2
অন্যথায় দুর্দান্ত উত্তরে উদাহরণ যুক্ত করতে: একটি হে (1) পদ্ধতিতে কল প্রতি 37 বছর সময় লাগতে পারে, অন্যদিকে O (n) পদ্ধতিতে কলটিতে 16 * n মাইক্রোসেকেন্ড লাগতে পারে। কোনটি দ্রুত?
কাজ ড্রাগন

16
এটি কীভাবে প্রশ্নের উত্তর দেয় তা দেখতে আমি পুরোপুরি ব্যর্থ।
অবাকর

7
আমি বড়-ও বুঝতে পারি। এটি প্রকৃত প্রশ্নের সমাধান করে না, যা ফাংশনগুলির নির্দিষ্ট উদাহরণ যেখানে কম বিগ-ও সহ অ্যালগরিদমগুলি উচ্চতর বি-ওযুক্ত ব্যক্তিদের দ্বারা ছাড়িয়ে যায়।
KyleWpppd

আপনি যখন প্রশ্নটি "কী কী উদাহরণগুলি ..." ফর্মটিতে রাখেন, তখন কেউ অনিবার্যভাবে "হ্যাঁ" বলে উত্তর দেয়। কোন কিছু না দিয়ে
রাকলাইস

1
@ ইরাকস্লাইস: সম্ভবত তাই। তবে এই সাইটটি আপনার যে কোনও বিবৃতি দেওয়ার ব্যাখ্যা (বা আরও ভাল প্রমাণ) দাবি করে। এখন প্রমাণের সর্বোত্তম উপায়, যে এরকম উদাহরণ রয়েছে তার একটি দেওয়া;)
back2dos

6

রেজেক্স লাইব্রেরিগুলি সাধারণত ব্যাকট্র্যাকিং করতে প্রয়োগ করা হয় যার মধ্যে ডিএফএ প্রজন্মের চেয়ে জটিলতম ক্ষতিকারক সময় রয়েছে যার জটিলতা রয়েছে O(nm)

যখন ইনপুট দ্রুত পথে চলতে থাকে বা অতিরিক্ত ব্যাকট্র্যাকের প্রয়োজন ছাড়াই ব্যর্থ হয় তখন নিষ্পাপ ব্যাকট্র্যাকিং আরও ভাল পারফরমার হতে পারে।

(যদিও এই সিদ্ধান্তটি কেবল পারফরম্যান্স ভিত্তিক নয়, এটি পুনরায় রেফারেন্সগুলিও মঞ্জুরি দেয়))


আমি মনে করি এটি আংশিক historicalতিহাসিক - একটি নিয়মিত প্রকাশকে ডিএফএ-তে পরিণত করার জন্য অ্যালগরিদমটি পেটেন্ট করা হয়েছিল যখন পূর্বের কয়েকটি সরঞ্জাম (সেড এবং গ্রেপ, আমার ধারণা) বিকাশ করা হয়েছিল। অবশ্যই আমি এটি আমার সংকলক প্রফেসরের কাছ থেকে শুনেছি যারা পুরোপুরি নিশ্চিত ছিলেন না, সুতরাং এটি তৃতীয় হাতের অ্যাকাউন্ট।
টিখন জেলভিস

5

একটি O(1)অ্যালগরিদম:

def constant_time_algorithm
  one_million = 1000 * 1000
  sleep(one_million) # seconds
end

একটি O(n)অ্যালগরিদম:

def linear_time_algorithm(n)
  sleep(n) # seconds
end

স্পষ্টতই, nযেখানে কোনও মানের জন্য n < one_million, O(n)উদাহরণে দেওয়া অ্যালগরিদমটি অ্যালগরিদমের চেয়ে দ্রুত হবে O(1)

যদিও এই উদাহরণটি কিছুটা আকর্ষণীয়, তবে এটি নিম্নলিখিত উদাহরণের সাথে আত্মার সমতুল্য:

def constant_time_algorithm
  do_a_truckload_of_work_that_takes_forever_and_a_day
end

def linear_time_algorithm(n)
  i = 0
  while i < n
    i += 1
    do_a_minute_amount_of_work_that_takes_nanoseconds
  end
end

আপনার অবশ্যই আপনার Oঅভিব্যক্তিটির ধ্রুবকগুলি এবং সহগগুলি অবশ্যই জানতে হবে এবং কোন অ্যালগরিদমটি দ্রুততর হবে এমন কোনও প্রাইরিn নির্ধারণ করতে আপনাকে অবশ্যই তার প্রত্যাশিত পরিধিটি জানতে হবে।

অন্যথায়, কোনও অ্যালগোরিদম দ্রুত শেষ হওয়ার পরে কোন পোস্টারিয়েরি নির্ধারণ করতে আপনার অবশ্যইn প্রত্যাশিত পরিসরের মানগুলির সাথে দুটি অ্যালগরিদমকে বেঞ্চমার্ক করতে হবে


4

শ্রেণীবিভাজন:

সন্নিবেশ সাজানোর কাজটি হ'ল (এন ^ 2) তবে অন্য সংখ্যক উপাদানগুলির জন্য অ্যালগরিদমকে বাছাই করে ও (এন * লগ (এন)) কে ছাড়িয়ে যায়।

এই কারণেই সর্বাধিক সাজানো বাস্তবায়ন দুটি অ্যালগরিদমের সংমিশ্রণ ব্যবহার করে। উদাহরণস্বরূপ বড় অ্যারেগুলি নির্দিষ্ট আকারে না পৌঁছানো পর্যন্ত ভেঙে ফেলার জন্য মার্জ সাজ্ট ব্যবহার করুন, তারপরে ছোট ইউনিটগুলিকে বাছাই করতে সন্নিবেশ সাজান ব্যবহার করুন এবং তাদের মার্জ সাজানোর সাথে আবার মার্জ করুন।

পাইথন এবং জাভা sort এর বাছাইয়ের বর্তমান ডিফল্ট বাস্তবায়ন টিমসোর্ট দেখুন যা এই কৌশলটি ব্যবহার করে।



3

যখন প্রোগ্রামটি ডিস্কে অদলবদল করা হচ্ছে বা তুলনা করার সময় ডিস্ক থেকে প্রতিটি আইটেম পড়তে হবে তখন মেমরিতে বুদবুদগুলি কুইকোর্টকে ছাড়িয়ে যেতে পারে।

এটি একটি উদাহরণ হতে পারে যার সাথে তিনি সম্পর্কিত হতে পারেন।


ওউ (1) এলোমেলো মেমোরি অ্যাক্সেসকে কুইকসোর্ট এবং বুদবুদোর্টে উদ্ধৃত জটিলতাগুলি ধরে না? যদি এটি আর না হয়, তবে কি কুইকোর্টস জটিলতা পুনরায় পরীক্ষা করার প্রয়োজন হবে না?
ভিক্টর ডাহল

@ ভিক্টরডাহল, আইটেমের অ্যাক্সেসের সময়টি traditionতিহ্যগতভাবে সাজানো অ্যালগরিদম জটিলতায় যা মাপা হচ্ছে তার অংশ নয় তাই "O (1)" এখানে শব্দের সঠিক পছন্দ নয়। পরিবর্তে "ধ্রুবক সময়" ব্যবহার করুন। পিএইচকে কিছুক্ষণ আগে বাছাই করা অ্যালগরিদম সম্পর্কে একটি নিবন্ধ লিখেছিল যে কিছু আইটেম অন্যের তুলনায় পুনরুদ্ধার করার জন্য আরও বেশি ব্যয়বহুল (ভার্চুয়াল মেমরি) - queue.acm.org/detail.cfm?id=1814327 - আপনাকে এটি আকর্ষণীয় মনে হতে পারে।

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

3

প্রায়শই আরও উন্নত অ্যালগরিদমগুলি নির্দিষ্ট পরিমাণে (ব্যয়বহুল) সেটআপ গ্রহণ করে। আপনার যদি কেবল একবার এটি চালানোর দরকার হয় তবে আপনি ব্রুট-ফোর্স পদ্ধতিতে আরও ভাল হতে পারেন।

উদাহরণস্বরূপ: বাইনারি অনুসন্ধান এবং হ্যাশ টেবিলের অনুসন্ধান উভয়ই প্রতি দৃষ্টিভঙ্গির চেয়ে দ্রুততর পরে লিনিয়ার অনুসন্ধান, তবে তাদের আপনাকে যথাক্রমে তালিকাটি বাছাই করতে বা হ্যাশ টেবিলটি তৈরি করতে হবে।

সাজানোর জন্য আপনার এন লগ (এন) এবং হ্যাশ টেবিলের জন্য কমপক্ষে এন ব্যয় হবে Now এখন আপনি যদি কয়েকশো বা হাজারো লুকআপ করতে যাচ্ছেন তবে এটি এখনও একটি স্বল্প পরিমাণে সঞ্চয়। তবে আপনার যদি কেবল একটি বা দুটি লুকআপ করার প্রয়োজন হয় তবে কেবল লিনিয়ার অনুসন্ধান করা এবং প্রারম্ভিক ব্যয়টি সংরক্ষণ করা বোধগম্য হতে পারে।


1

ডিক্রিপশন প্রায়শই 0 (1) হয়। উদাহরণস্বরূপ, ডিইএসের জন্য মূল স্থান 2 ^ 56, সুতরাং কোনও বার্তার ডিক্রিপশন একটি ধ্রুবক সময় কাজ। এটি ঠিক যে সেখানে আপনার 2 ^ 56 এর একটি ফ্যাক্টর রয়েছে তাই এটি সত্যিই একটি বড় ধ্রুবক।


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

আপনি সম্ভবত ডিক্রিপশন চেয়ে ক্রিপ্টনানালাইসিস বোঝাতে চান?
Oct

3
ঠিক আছে, হ্যাঁ, এমন অনেকগুলি জিনিস রয়েছে যা আপনি ধ্রুব হয়ে থাকতে পারেন এবং একটি অ্যালগরিদমকে ও (1) হিসাবে ঘোষণা করতে পারেন। [সুস্পষ্টভাবে বাছাই করা উপাদানগুলি তুলনা করতে অবিচ্ছিন্ন সময় নেয় উদাহরণস্বরূপ, বা অ-বিগনাম সংখ্যার সাথে কোনও গণিত] ধরে রাখুন
র্যান্ডম 832

1

সেটগুলির বিভিন্ন বাস্তবায়ন আমার মনে বসন্ত। সর্বাধিক নিখুঁতদের মধ্যে একটি এটি একটি ভেক্টরের উপর প্রয়োগ করা হচ্ছে, যার অর্থ removeপাশাপাশি containsএবং তাই addসমস্ত ও (এন) গ্রহণ করে।
একটি বিকল্প হ'ল কিছু সাধারণ উদ্দেশ্য হ্যাশ ধরে এটি প্রয়োগ করা, যা ইনপুট হ্যাশগুলিকে ইনপুট মানগুলিতে মানচিত্র করে। জন্য O (1) সঙ্গে এই ধরনের একটি সেট বাস্তবায়ন সঞ্চালিত add, containsএবং remove

যদি আমরা ধরে নিই যে এন প্রায় 10 বা তার বেশি, তবে প্রথম প্রয়োগটি সম্ভবত দ্রুততর হয়। একটি উপাদান অনুসন্ধান করতে যা যা করতে হয় তা হ'ল 10 টির সাথে একটি মানকে তুলনা করা।
অন্যান্য বাস্তবায়নের জন্য 10 ধরণের তুলনা করার চেয়ে সমস্ত ধরণের চালাক রূপান্তর শুরু করতে হবে যা অনেক বেশি ব্যয়বহুল হতে পারে। সমস্ত ওভারহেড সহ, আপনি এমনকি ক্যাশে মিস করতে পারেন এবং তারপরে তাত্ত্বিকভাবে আপনার সমাধানটি কতটা দ্রুত ঘটেছে তা আসলে ব্যাপার নয়।

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

বাস্তব জগতের দৃশ্যে কোনও জিনিস কত দ্রুত তা আপনি সত্যিই জানতে পারবেন না, যতক্ষণ না আপনি এটিকে একটিতে ফেলেছেন এবং কেবল এটি পরিমাপ করেন না। প্রায়শই ফলাফলগুলি অবাক করে (কমপক্ষে আমার কাছে)।


1

হ্যাঁ, উপযুক্তভাবে ছোট এন এর জন্য সর্বদা একটি এন থাকবে যার উপরে আপনি সর্বদা অর্ডারিং ও (1) <ও (এলজি এন) <ও (এন) <ও (এন লগ এন) <ও (এন ^ সি) থাকবেন ) <ও (সি ^ এন) (যেখানে ও (1) <ও (এলজি এন) এর অর্থ হ'ল একটি ও (1) এ অ্যালগরিদম কম অপারেশন নেবে যখন এন উপযুক্তভাবে বড় হবে এবং সি একটি স্থির ধ্রুবক যা 1 এর চেয়ে বেশি হবে )।

বলুন কোনও নির্দিষ্ট হে (1) অ্যালগরিদম ঠিক f (N) = 10 ^ 100 (একটি গুগল) ক্রিয়াকলাপ গ্রহণ করে এবং একটি হে (এন) অ্যালগোরিদম ঠিক জি (এন) = 2 এন + 5 অপারেশন নেয়। ও (এন) অ্যালগরিদম আরও বেশি পারফরম্যান্স দেবে যতক্ষণ না আপনি এন মোটামুটি গুগল হয়ে থাকেন (আসলে যখন এন> (10 ^ 100 - 5) / 2), তাই আপনি যদি কেবলমাত্র এন এর 1000 থেকে এক বিলিয়নের মধ্যে থাকবেন বলে আশা করেছিলেন ও (1) অ্যালগরিদম ব্যবহার করে একটি বড় জরিমানা ভোগ করবে।

অথবা বাস্তবসম্মত তুলনার জন্য বলুন যে আপনি একসাথে এন-অঙ্কের সংখ্যাগুলি গুণাচ্ছেন। Karatsuba অ্যালগরিদম সর্বাধিক 3 এন ^ অপারেশন (3 এলজি) (মোটামুটিভাবে যে হে (ঢ ^ 1.585)) যখন Schönhage-Strassen অ্যালগরিদম হে (n log n লগ log n) যা হয় দ্রুত অর্ডার কিন্তু উদ্ধৃত করার উইকিপিডিয়া:

অনুশীলনে শানহেজ – স্ট্র্যাসেন অ্যালগরিদম করাতসুবা এবং টুমের মতো পুরানো পদ্ধতিগুলিকে ছাড়িয়ে যেতে শুরু করে 2 2 ^ 2 ^ 15 থেকে 2 ^ 2 ^ 17 (10,000 থেকে 40,000 দশমিক সংখ্যা) ছাড়িয়ে সংখ্যার জন্য গুণনীয় রান্না করে [[4] [5] [6 ]

সুতরাং আপনি যদি 500 সংখ্যার সংখ্যাকে একসাথে গুণাচ্ছেন, তবে বড় হে আর্গুমেন্ট দ্বারা "দ্রুত" যে অ্যালগরিদমটি ব্যবহার করা তা বোধগম্য নয়।

সম্পাদনা: আপনি f (N) তুলনা g (N) নির্ধারণ করতে পারবেন, সীমাটি N-> অসীমতা f (N) / g (N) নিয়ে। সীমা যদি 0 হয় তবে f (N) <g (N), সীমাটি যদি অসীম হয় তবে f (N)> g (N), এবং যদি সীমাটি অন্য কোনও ধ্রুবক হয় তবে f (N) ~ g (N) বড় হে স্বরলিপি হিসাবে।


1

লিনিয়ার প্রোগ্রামিংয়ের সিমপ্লেক্স পদ্ধতিটি সবচেয়ে খারাপ ক্ষেত্রে ক্ষতিকারক হতে পারে, অন্যদিকে তুলনামূলকভাবে নতুন অভ্যন্তর বিন্দু অ্যালগরিদমগুলি বহুত্বপূর্ণ হতে পারে।

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


0

প্রত্যয় চেষ্টা করার জন্য উকোনেনের অ্যালগরিদম হ'ল হে (এন লগ এন)। এটি "অন-লাইন" হওয়ার সুবিধা রয়েছে - অর্থাৎ, আপনি ক্রমবর্ধমান আরও পাঠ্য সংযোজন করতে পারেন।

সম্প্রতি, আরও জটিল জটিল অ্যালগরিদমগুলি অনুশীলনে দ্রুততর বলে দাবি করেছে, মূলত কারণ তাদের মেমরির অ্যাক্সেসের উচ্চতর লোকাল রয়েছে, এইভাবে প্রসেসরের ক্যাশের ব্যবহার উন্নত করে এবং সিপিইউ পাইপলাইন স্টল এড়িয়ে চলে। উদাহরণস্বরূপ, এই সমীক্ষাটি দেখুন , যা দাবি করে যে প্রসেসিংয়ের 70-80% সময় মেমরির জন্য অপেক্ষা করতে ব্যয় করে, এবং এই কাগজটি "wotd" অ্যালগরিদম বর্ণনা করে।

জেনেটিক্সে (জিন সিকোয়েন্সগুলির সাথে মিলে যাওয়ার জন্য) প্রত্যয় চেষ্টা গুরুত্বপূর্ণ এবং স্ক্র্যাবল ডিকশনারিগুলির প্রয়োগে কিছুটা কম গুরুত্বপূর্ণ।


0

যে কোনও সংজ্ঞায়িত সমস্যার জন্য সর্বদা দ্রুত এবং সংক্ষিপ্ততম অ্যালগরিদম থাকে । এটি কেবলমাত্র তাত্ত্বিকভাবে (অ্যাসিপটোটিক্যালি) দ্রুততম অ্যালগরিদম যদিও।

কোন সমস্যা হওয়ার কোনো বিবরণ দেওয়া পি যে সমস্যা এবং একটি দৃষ্টান্ত আমি , এটা সব সম্ভব আলগোরিদিম উল্লেখ একজন এবং প্রমাণগুলি Pr , প্রতিটি যেমন জুড়ি কিনা পরীক্ষা করার Pr একটি বৈধ প্রমাণ যে একজন জন্য এসিম্পটোটিকভাবে দ্রুততম আলগোরিদিম পি । এটা যেমন একটি প্রমাণ খুঁজে বের করে, তাহলে এটি তারপর executes একটি উপর আমি

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


0

অনেকগুলি ভাষা / ফ্রেমওয়ার্কগুলি কেএমপির পরিবর্তে স্ট্রিংগুলির সাথে মেলে অনন্য প্যাটার্ন ম্যাচিং ব্যবহার করে । আমরা টম, নিউইয়র্কের মতো স্ট্রাগের দিকে আব্বাবাববাববাবই বাববাবের চেয়ে সন্ধান করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.