কীভাবে "কিছু পরীক্ষার মামলার চেষ্টা করুন" তাত্পর্যপূর্ণ বোকা: অ্যালগরিদমগুলি যা সঠিক প্রদর্শিত হয়, কিন্তু আসলে এটি ভুল


105

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

যাইহোক, অ্যালগরিদম শিখার সময়, কিছু শিক্ষার্থী সেখানে থামার জন্য প্ররোচিত হয়: যদি তাদের অ্যালগরিদম চেষ্টা করার চেষ্টা করতে পারে এমন সমস্ত কোণার কেসগুলি সহ কয়েকটি মুখ্য উদাহরণগুলিতে সঠিকভাবে কাজ করে, তবে তারা সিদ্ধান্তে পৌঁছে যে অ্যালগরিদমটি অবশ্যই সঠিক হতে হবে। সেখানে সবসময়ই একজন শিক্ষার্থী জিজ্ঞাসা করেন: "আমার অ্যালগরিদমকে সঠিক প্রমাণ করার দরকার কেন, আমি যদি পরীক্ষার কয়েকটি ক্ষেত্রে চেষ্টা করতে পারি তবে?"

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

বিশেষত, আমি খুঁজছি:

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

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

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

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

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


2
আমি আপনার প্রশ্নটি ভালবাসি, এটি একটি খুব আকর্ষণীয় প্রশ্নের সাথেও জড়িত যা আমি অন্য দিন গণিতের সাথে বড় ধ্রুবকের সাথে অনুমানগুলি অস্বীকার করার সাথে দেখেছি । আপনি এটি এখানে
ZeroUltimax

1
আরও কিছু খনন করা হয়েছিল এবং আমি সেই দুটি জ্যামিতিক অ্যালগোরিদম পেয়েছি ।
জিরোআল্টিমেক্স 21

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

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

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

উত্তর:


70

আমি মনে করি একটি সাধারণ ত্রুটি লোভী অ্যালগরিদম ব্যবহার করা যা সর্বদা সঠিক পদ্ধতির নয়, তবে বেশিরভাগ পরীক্ষার ক্ষেত্রে এটি কাজ করতে পারে।

উদাহরণ: ধাতব মুদ্রা গোষ্ঠীর, এবং একটি সংখ্যা , প্রকাশ করার একটি সমষ্টি হিসাবে যতটা সম্ভব কম কয়েন সঙ্গে গুলি। n n d id1,,dknndi

প্রথমে সবচেয়ে বড় সম্ভাব্য মুদ্রা ব্যবহার করা এবং লোভের সাথে এই জাতীয় যোগফল তৈরি করা একটি নিরপেক্ষ পদ্ধতির।

উদাহরণস্বরূপ, , এবং এর মানযুক্ত মুদ্রাগুলি নম্বর বাদে এবং মধ্যে সমস্ত সংখ্যার জন্য লোভী সহ সঠিক উত্তর দেবে ।5 1 1 14 10 = 6 + 1 + 1 + 1 + 1 = 5 + 565111410=6+1+1+1+1=5+5


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

2
উপরন্তু, আমি এটিও বলতে পারি যে শিক্ষার্থীদের প্রায়শই এই উদাহরণেও ভুল প্রমাণ থাকতে পারে (কাছাকাছি পরীক্ষায় ব্যর্থ হওয়া কিছু নিষ্পাপ যুক্তি খেলাধুলা করা), সুতরাং এখানে একাধিক পাঠ শেখা যায়।
রাফায়েল

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

1
প্রকৃতপক্ষে অনেক ক্ষেত্রে লোভী অ্যালগরিদমগুলি যুক্তিসঙ্গত বলে মনে হয়, তবে কাজ করে না - এর একটি উদাহরণ সর্বাধিক দ্বিপক্ষীয় মিল। অন্যদিকে, এমন কয়েকটি উদাহরণ রয়েছে যেখানে দেখে মনে হয় লোভী অ্যালগরিদমটি কাজ করা উচিত নয়, তবে এটি করে: সর্বাধিক বিস্তৃত গাছ।
jkff

62

আমি সঙ্গে সঙ্গে আর। ব্যাকহাউসের একটি উদাহরণ স্মরণ করলাম (এটি তাঁর কোনও বইতে থাকতে পারে) been স্পষ্টতই, তিনি একটি প্রোগ্রামিং কার্য অর্পণ করেছিলেন যেখানে শিক্ষার্থীদের দুটি স্ট্রিংয়ের সমতা পরীক্ষা করার জন্য একটি পাস্কাল প্রোগ্রাম লিখতে হয়েছিল। একজন শিক্ষার্থী চালু হওয়া প্রোগ্রামগুলির মধ্যে একটি ছিল:

issame := (string1.length = string2.length);

if issame then
  for i := 1 to string1.length do
    issame := string1.char[i] = string2.char[i];

write(issame);

আমরা এখন নিম্নলিখিত ইনপুট দিয়ে প্রোগ্রামটি পরীক্ষা করতে পারি:

"বিশ্ববিদ্যালয়" "বিশ্ববিদ্যালয়" ট্রু; ঠিক আছে

"অবশ্যই" "কোর্স" ট্রু; ঠিক আছে

"" "" ট্রু; ঠিক আছে

"বিশ্ববিদ্যালয়" "কোর্স" ভুয়া; ঠিক আছে

"বক্তৃতা" "কোর্স" ফ্যালস; ঠিক আছে

"নির্ভুলতা" "নির্ভুলতা" ভুয়া, ঠিক আছে

এই সমস্ত খুব আশাব্যঞ্জক বলে মনে হচ্ছে: সম্ভবত প্রোগ্রামটি সত্যিই কাজ করে। "খাঁটি" এবং "সত্য" বলার সাথে আরও সতর্কতার সাথে পরীক্ষাটি ত্রুটিযুক্ত আউটপুট প্রকাশ করে। আসলে, প্রোগ্রামটি "ট্রু" বলে যদি স্ট্রিংগুলির একই দৈর্ঘ্য এবং একই শেষ অক্ষর থাকে!

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


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

নীচের লাইন: কেবল বাইনারি অনুসন্ধানের অ্যালগরিদম কেবল এটি পরীক্ষা করে সঠিক হওয়া নিশ্চিত হওয়া অবাক করা কঠিন।


9
অবশ্যই, ত্রুটিটি উত্স থেকে বেশ স্পষ্ট হয় (যদি আপনি নিজে আগে একটি অনুরূপ জিনিস লিখে থাকেন)।
রাফেল

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

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

8
@ মিঃ মাইন্ডার: আপনি কীভাবে বলতে পারবেন যে প্রোগ্রামার সঠিক অ্যালগরিদম লিখেছেন এবং তারপরে এটি ভুলভাবে প্রয়োগ করেছেন, বা একটি ভুল অ্যালগরিদম লিখেছেন এবং তারপরে বিশ্বস্ততার সাথে এটি প্রয়োগ করেছেন (আমি "সঠিকভাবে" বলতে দ্বিধা বোধ করি!)
স্টিভ জেসপ

1
@ ওয়াবিট এটি বিতর্কযোগ্য আপনার কাছে যা স্পষ্ট তা প্রথম বর্ষের শিক্ষার্থীর কাছে সুস্পষ্ট নাও হতে পারে।
জুহো

30

আমি এর মধ্যে যে সর্বোত্তম উদাহরণটি পেয়েছি তা হ'ল আদিমতার পরীক্ষা:

ইনপুট: প্রাকৃতিক সংখ্যা পি, পি! = 2
আউটপুট: পা প্রাইম নাকি?
অ্যালগরিদম: গণনা 2 ** (পি -1) মোড পি। যদি ফলাফল = 1 হয় তবে পি প্রধান হয় অন্যথায় পি হয় না।

এটি কয়েকটি সংখ্যক পাল্টা উদাহরণ ব্যতীত (প্রায়) প্রতিটি সংখ্যার জন্য কাজ করে এবং বাস্তবের সময়ের জন্য একটি কাউন্টারেরেক্সাম খুঁজে পেতে আসলে একটি মেশিনের প্রয়োজন হয়। প্রথম কাউন্টারেরেক্সাম্পলটি 341, এবং কাউন্টারিক্সগুলির নমুনার ঘনত্ব আসলে পি ক্রমবর্ধমান সহ হ্রাস পায়, যদিও লোগারিথমেজিকভাবে প্রায়।

শক্তির ভিত্তি হিসাবে কেবল 2 ব্যবহারের পরিবর্তে, আগের প্রাইম 1 ফিরে আসার ক্ষেত্রে অতিরিক্ত হিসাবে ছোট ছোট প্রাইমগুলি ব্যবহার করে অ্যালগরিদমকে উন্নত করতে পারে And এবং এখনও, এই স্কিমের প্রতিরূপ রয়েছে, যথা: কারমাইকেল সংখ্যাগুলি, যদিও বেশ বিরল


ফারমেট প্রিমিটিটি পরীক্ষা একটি সম্ভাব্য পরীক্ষা, সুতরাং আপনার পোস্ট-শর্তটি সঠিক নয়।
Femaref

5
ofc এটি একটি সম্ভাবনাময় পরীক্ষা তবে উত্তরটি খুব সুন্দরভাবে দেখায় (আরও সাধারণভাবে) ঠিক কীগুলির জন্য ভুল সম্ভাবনাযুক্ত অ্যালগোরিদমগুলি ত্রুটির উত্স হতে পারে। সম্পর্কে আরও কারমাইকেল সংখ্যার
vzn

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

1
আপনি যে সীমাবদ্ধতার কথা উল্লেখ করেছেন তা ব্যবহারিক, তাত্ত্বিক নয় এবং ক্রিপ্টো সিস্টেমে প্রাথমিক পরীক্ষার উদাহরণস্বরূপ আরএসএ বিরল / অত্যন্ত অসম্ভব ব্যর্থতার সাপেক্ষে আবার উদাহরণের তাত্পর্য উল্লেখ করে। অর্থ্যাৎ বাস্তবে কখনও কখনও এই সীমাবদ্ধতা অনিবার্য হিসাবে গ্রহণ করা হয়। প্রাইমালিটি পরীক্ষার জন্য পি টাইম অ্যালগরিদম আছে যেমন একেএস কিন্তু অনুশীলনে ব্যবহৃত "ছোট" সংখ্যার জন্য তারা খুব বেশি সময় নেয়।
vzn

আপনি যদি কেবল 2 পি দিয়ে পরীক্ষা করেন না , তবে 50 টি বিভিন্ন এলোমেলো মান 2 ≤ a <p এর জন্য পি দিয়ে পরীক্ষা করেন, তবে বেশিরভাগ লোকেরা এটি জানতে পারবেন যে এটি সম্ভাব্য, তবে ব্যর্থতার সাথে এতটা সম্ভাবনা নেই যে আপনার কম্পিউটারে কোনও ত্রুটি তৈরি হতে পারে more ভুল উত্তর। 2 পি, 3 পি, 5 পি এবং 7 পি সহ, ব্যর্থতা ইতিমধ্যে খুব বিরল।
gnasher729

21

আমি যে কনভেনশনটিতে গিয়েছিলাম সে সম্পর্কে এখানে গুগল রিপস দ্বারা ছুঁড়ে দেওয়া হয়েছিল। এটি সি তে কোডড ছিল তবে এটি অন্যান্য ভাষায় কাজ করে যা উল্লেখগুলি ব্যবহার করে। [Cs.se] তে কোড করার জন্য দুঃখিত, তবে কেবলমাত্র এটি চিত্রিত করার জন্য।

swap(int& X, int& Y){
    X := X ^ Y
    Y := X ^ Y
    X := X ^ Y
}

এই অ্যালগরিদমটি x এবং y প্রদত্ত যে কোনও মানের জন্য কাজ করবে, এমনকি যদি তাদের মান একই থাকে। এটিকে অদলবদল (x, x) বলা হলেও এটি কাজ করবে না। এই পরিস্থিতিতে, x 0 হিসাবে শেষ হয় Now এখন, এটি আপনাকে সন্তুষ্ট করতে পারে না, যেহেতু আপনি কোনওভাবে এই অপারেশনটিকে গাণিতিকভাবে সঠিক প্রমাণ করতে পারেন, তবে এখনও এই প্রান্তের ঘটনাটি ভুলে যান।


1
ত্রুটিযুক্ত আরসি 4 বাস্তবায়ন উত্পাদন করতে সেই কৌশলটি আন্ডারহ্যান্ডেড সি প্রতিযোগিতায় ব্যবহৃত হয়েছিল । আর্টিকেলটি আবার পড়ে, আমি কেবল লক্ষ্য করেছি যে এই হ্যাকটি সম্ভবত @DW
CodeInChaos

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

আমি কেন অবাক হয়েছি যে এতো বেশি ভোট হয়েছে ed
জিরোআল্টিমেক্স 21

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

16

অ্যালগরিদমগুলির একটি সম্পূর্ণ ক্লাস রয়েছে যা পরীক্ষা করা সহজাতভাবে শক্ত: সিউডো-এলোমেলো সংখ্যা জেনারেটর । আপনি একটি একক আউটপুট পরীক্ষা করতে পারবেন না তবে পরিসংখ্যানের সাহায্যে আউটপুটগুলির (বহু) সিরিজ অনুসন্ধান করতে হবে। কী এবং কীভাবে আপনি পরীক্ষা করেন তার উপর নির্ভর করে আপনি এলোমেলো বৈশিষ্ট্যগুলি ভালভাবে মিস করতে পারেন।

একটি বিখ্যাত ঘটনা যেখানে জিনিসগুলি মারাত্মকভাবে ভুল হয়ে গেছে সেটি হ'ল র্যান্ডু । এটি সেই সময়ে উপলব্ধ যাচাই-বাছাই পাস করেছে - যা পরবর্তী ফলাফলগুলির tuples এর আচরণ বিবেচনা করতে ব্যর্থ হয়েছিল । ইতিমধ্যে ট্রিপলগুলি প্রচুর কাঠামো দেখায়:

মূলত, পরীক্ষাগুলি সমস্ত ব্যবহারের ক্ষেত্রে কভার দেয় না: যদিও র‌্যান্ডু-এর একক-মাত্রিক ব্যবহার (সম্ভবত বেশিরভাগ) জরিমানা ছিল, ত্রি-মাত্রিক পয়েন্টগুলি (এইভাবে) নমুনা হিসাবে এটি ব্যবহার করে এটি সমর্থন করে না।

যথাযথ সিউডো-এলোমেলো নমুনা একটি কৌতুকপূর্ণ ব্যবসা। ভাগ্যক্রমে, সেখানে শক্তিশালী পরীক্ষা স্যুট রয়েছে, যেমন ডায়ারহডার যা প্রস্তাবিত জেনারেটরে আমরা জানি সমস্ত পরিসংখ্যান নিক্ষেপ করতে বিশেষী । এটা কি যথেষ্ট?

ন্যায়পরায়ণভাবে বলতে গেলে, পিআরএনজির জন্য আপনি কীভাবে সম্ভবত প্রমাণ করতে পারবেন তা আমার কোনও ধারণা নেই।


2
সুন্দর উদাহরণ তবে বাস্তবে কোনও পিআরএনজির কোনও ত্রুটি নেই তা প্রমাণ করার উপায় নেই, কেবল দুর্বল বনাম শক্তিশালী পরীক্ষার এক অসীম শ্রেণিবিন্যাস রয়েছে। যে কোনও কঠোর অর্থে আসলে একজনকে "এলোমেলো" প্রমাণ করা সম্ভবত অনির্বচনীয় (যদিও তা প্রমাণিত হয়নি)।
vzn

1
এটি এমন কিছুর একটি ভাল ধারণা যা পরীক্ষা করা শক্ত, তবে আরএনজি প্রমাণ করাও শক্ত। পিআরএনজি বাস্তবায়ন বাগগুলির পক্ষে এতটা প্রবণ নয় যেগুলি খারাপভাবে নির্দিষ্ট করা হয়েছে। ডাইহার্ডের মতো টেস্টগুলি কিছু ব্যবহারের জন্য ভাল তবে ক্রিপ্টোর জন্য, আপনি ডাইহার্ড পাস করতে পারেন এবং এখনও ঘর থেকে হেসে উঠতে পারেন। কোনও "নিরাপদ প্রমাণিত" সিএসপিআরএনজি নেই, আপনি আশা করতে পারেন যে আপনার সিএসপিআরএনজিটি যদি ভেঙে যায় তবে এএসও হ'ল সর্বোত্তম hope
গিলস

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

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

1
@ ভিজেএন: সংখ্যার এলোমেলো ক্রম বলতে কী বোঝায় তা অনেকগুলি সম্ভাব্য উপায়ে সংজ্ঞায়িত করা যেতে পারে, তবে একটি সহজ "বড় কমলগোরভ জটিলতা"। সেক্ষেত্রে, এলোমেলোতা নির্ধারণ করা অনস্বীকার্য তা দেখানো সহজ।
কোডি

9

সর্বোচ্চ 2 ডি স্থানীয়

n×nA

(i,j)A[i,j]

A[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

তারপরে প্রতিটি গাed় কক্ষটি স্থানীয় সর্বাধিক। প্রতিটি খালি খালি অ্যারে কমপক্ষে একটি স্থানীয় সর্বাধিক আছে।

O(n2)

AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

n2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

সুতরাং, আমরা নিম্নলিখিত উপপাদ্য প্রমাণ করেছি:

O(n)n×n

নাকি আমাদের আছে?


T(n)=O(nlogn)T(n)=T(n/2)+O(n)

2
এটি একটি সুন্দর উদাহরণ! আমি এটা ভালোবাসি. ধন্যবাদ. (অবশেষে আমি এই অ্যালগরিদমের ত্রুটিটি বুঝতে পেরেছি the টাইমস্ট্যাম্পগুলি থেকে আপনি আমাকে কতটা সময় নিয়েছিলেন তা সম্পর্কে আপনি নীচের দিকে বেঁধে দিতে পারেন the আসল সময়টি প্রকাশ করতে আমি খুব বিব্রতবোধ করছি: :-)
ডিডাব্লু

1
O(n)

8

এগুলি আদিমতার উদাহরণ, কারণ এগুলি সাধারণ।

(1) সিমপাইতে আদিমতা। সংখ্যা 1789 । একটি সুপরিচিত ওয়েবসাইটটিতে একটি ভুল পরীক্ষা করা হয়েছিল যা 10 ^ 14 এর পরে ব্যর্থ হয় নি। ফিক্সটি সঠিক ছিল, এটি সমস্যাটি পুনর্বিবেচনা করার পরিবর্তে কেবল গর্তগুলি প্যাচ করছে।

(২) পার্ল Pri. আদিমত্ব Per. পার্ল is প্রাইম প্রিম যুক্ত করেছে যা স্থির ঘাঁটি সহ বেশ কয়েকটি এমআর টেস্ট ব্যবহার করে। পরিচিত কাউন্টারিক্স উদাহরণ রয়েছে, তবে এগুলি বেশ বড় যেহেতু ডিফল্ট পরীক্ষাগুলির সংখ্যা বিশাল (মূলত অবজ্ঞার পারফরম্যান্সের মাধ্যমে আসল সমস্যাটি আড়াল করে)। এটি শীঘ্রই সমাধান করা হবে।

(3) ফ্লিন্টে আদিমতা। n_isprime () ঠিক করা থেকে কম্পোজিটগুলির জন্য সত্য প্রত্যাবর্তন । মূলত SymPy হিসাবে একই সমস্যা। এসপিআরপি -২ সিউডোপ্রিমের ফিটসমা / গ্যালওয়ে ডাটাবেসটি 2 ^ 64 তে ব্যবহার করে আমরা এখন এটি পরীক্ষা করতে পারি।

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

(5) পরীর প্রাক-2.2 is_prime। গণিত :: পরী টিকিট । এটি এমআর পরীক্ষার জন্য ১০ টি এলোমেলো ঘাঁটি ব্যবহার করেছে (প্রতিটি কলটিতে GMP এর স্থির বীজের চেয়ে প্রারম্ভকালে স্থির বীজ সহ)। এটি আপনাকে বলবে যে প্রতি 1 এম কলগুলির মধ্যে 9 টি প্রাইম। আপনি যদি সঠিক নম্বরটি বেছে নেন তবে তুলনামূলকভাবে প্রায়শই এটি ব্যর্থ হতে পারে তবে সংখ্যাগুলি স্পার হয়ে যায়, তাই এটি অনুশীলনে খুব বেশি দেখাবে না। এরপরে তারা অ্যালগরিদম এবং এপিআই পরিবর্তন করেছে।

এটি ভুল নয় তবে এটি সম্ভাব্য পরীক্ষার একটি ক্লাসিক: আপনি কতগুলি রাউন্ড দিবেন, বলুন, এমপিজেড_প্রব্যাব_প্রাইম_পি? যদি আমরা এটি 5 টি রাউন্ড দিই তবে অবশ্যই এটি দেখতে ভাল লাগে - সংখ্যাগুলিকে একটি বেস -210 ফার্ম্যাট পরীক্ষা এবং তারপরে 5 প্রাক-নির্বাচিত বেসগুলি মিলার-রবিন পরীক্ষা পাস করতে হবে। আপনি 3892757297131 (GMP 5.0.1 বা 6.0.0a সহ) অবধি কোনও কাউন্টারের নমুনা পাবেন না, সুতরাং এটি সন্ধানের জন্য আপনাকে প্রচুর পরীক্ষা করতে হবে। তবে 2 ^ 64 এর নিচে হাজার হাজার প্রতিসামগ্রী রয়েছে। সুতরাং আপনি সংখ্যা বাড়াতে থাকুন। কত দূর? বিরোধী আছে কি? সঠিক উত্তর কতটা গুরুত্বপূর্ণ? আপনি কি স্থির বেসগুলির সাথে এলোমেলো ঘাঁটি গুলিয়ে ফেলছেন? আপনি কি ইনপুট আকার দেওয়া হবে জানেন?

1016

এগুলি সঠিকভাবে পরীক্ষা করা বেশ কঠিন। আমার কৌশলটিতে সুস্পষ্ট ইউনিট পরীক্ষা, প্লাস এজ প্রসেস, প্লাসের আগে বা অন্যান্য প্যাকেজগুলিতে দেখা ব্যর্থতার উদাহরণ, পরীক্ষা বনাম জ্ঞাত ডাটাবেসগুলি যেখানে সম্ভব রয়েছে অন্তর্ভুক্ত রয়েছে (উদাহরণস্বরূপ যদি আপনি একটি একক বেস -২ এমআর টেস্ট করেন, তবে আপনি গণনা অপরিবর্তনীয় প্রায় 32 মিলিয়ন সংখ্যার পরীক্ষার জন্য 2 ^ 64 সংখ্যা পরীক্ষা করার কাজ) এবং শেষ পর্যন্ত প্রচুর এলোমেলোভাবে পরীক্ষাগুলি স্ট্যান্ডার্ড হিসাবে অন্য প্যাকেজটি ব্যবহার করে। শেষ পয়েন্টটি আদিমতার মতো ফাংশনগুলির জন্য কাজ করে যেখানে মোটামুটি সরল ইনপুট এবং একটি পরিচিত আউটপুট রয়েছে তবে বেশ কয়েকটি কার্য এইরকম। তুলনা প্যাকেজগুলির মধ্যে মাঝে মাঝে আমার নিজের বিকাশ কোডের সাথে সাথে মাঝে মধ্যে সমস্যাগুলি খুঁজে পেতে এটি ব্যবহার করেছি। তবে অসীম ইনপুট স্থান দেওয়া, আমরা সবকিছু পরীক্ষা করতে পারি না।

যথার্থতা প্রমাণের জন্য, এখানে আরও একটি প্রাথমিক উদাহরণ। বিএলএস 75 পদ্ধতি এবং ইসিপিপিতে প্রাথমিকতা শংসাপত্রের ধারণা রয়েছে। মূলত তারা তাদের প্রমাণগুলির জন্য কাজ করে এমন মানগুলি খুঁজতে অনুসন্ধানগুলি চালিয়ে যাওয়ার পরে তারা এগুলি একটি পরিচিত ফর্ম্যাটে আউটপুট করতে পারে। এরপরে একজন যাচাইকারী লিখতে বা অন্য কাউকে এটি লিখতে বাধ্য করতে পারে। এগুলি সৃষ্টির সাথে তুলনা করে খুব দ্রুত চলে এবং এখন (1) উভয় কোডের টুকরোটিই ভুল (তাই আপনি যাচাইকারীদের জন্য অন্য প্রোগ্রামারদের পছন্দ করেন) বা (২) প্রমাণ ধারণার পিছনে গণিতটি ভুল is # 2 সর্বদা সম্ভব, তবে এগুলি সাধারণত একাধিক ব্যক্তি দ্বারা প্রকাশিত এবং পর্যালোচনা করা হয়েছে (এবং কিছু ক্ষেত্রে আপনার নিজের মধ্য দিয়ে চলার পক্ষে যথেষ্ট সহজ)।

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

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


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

আপনি প্রথম পয়েন্টে ঠিকই রয়েছেন - সঠিক আলগোরিদিম + বাগটি বিন্দু নয়, যদিও আলোচনা এবং অন্যান্য উদাহরণগুলি এগুলিও বিভ্রান্ত করছে। ক্ষেত্রটি অনুমানের সাথে পাকা যা ছোট সংখ্যার জন্য কাজ করে তবে ভুল। পয়েন্টের জন্য (২) এটি কারও পক্ষে সত্য, তবে আমার উদাহরণ # 1 এবং # 3 এই ক্ষেত্রে ছিল না - এটি বিশ্বাস করা হয়েছিল যে অ্যালগরিদমটি সঠিক ছিল (এই 5 টি বেসগুলি 10 ^ 16 এর নীচে সংখ্যার জন্য প্রমাণিত ফলাফল দেয়), তারপরে পরে এটি আবিষ্কার ছিল যে এটি ছিল না।
ডানাজে

সিউডো-আদিমত্ব পরীক্ষা দিয়ে এটি কী মৌলিক সমস্যা নয়?
asmeurer

asmeurer, হ্যাঁ আমার # 2 এ এবং তাদের পরবর্তী আলোচনায়। তবে # 1 এবং # 3 হ'ল একটি থ্রেশহোল্ডের নীচে নির্বিচারবাদী সঠিক ফলাফল দেওয়ার জন্য মিলার-রবিনকে পরিচিত ঘাঁটি সহ ব্যবহার করার ক্ষেত্রে cases সুতরাং এক্ষেত্রে "অ্যালগরিদম" (ওপির সাথে মিলের জন্য looseিলে .ালা শব্দটি ব্যবহার করে) ভুল ছিল। # 4 সম্ভাব্য প্রাথমিক পরীক্ষা নয়, তবে ডিডাব্লু নির্দেশিত হিসাবে, অ্যালগরিদম ঠিকঠাক কাজ করে, এটি কেবল বাস্তবায়নই কঠিন। আমি এটিকে অন্তর্ভুক্ত করেছি কারণ এটি একই ধরণের পরিস্থিতির দিকে পরিচালিত করে: পরীক্ষার প্রয়োজন হয় এবং আপনি এটির কাজ করার আগে সাধারণ উদাহরণগুলির বাইরে কতদূর যেতে পারেন?
ডানাজে

আপনার পোস্টে কিছু মনে হচ্ছে এমন প্রশ্নটি খাপ খায় তবে কিছু না (সিএফ @ ডিডাব্লু এর মন্তব্য)। দয়া করে উদাহরণগুলি (এবং অন্যান্য সামগ্রী) সরান যা প্রশ্নের উত্তর দেয় না।
রাফেল

7

ফিশার-ইয়েটস-নুথ শিফলিং অ্যালগরিদম একটি (ব্যবহারিক) উদাহরণ এবং যার উপর এই সাইটের কোনও লেখক মন্তব্য করেছেন

অ্যালগরিদম একটি প্রদত্ত অ্যারের এলোমেলোভাবে ক্রমানুসরণ উত্পন্ন করে:

 // To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

ij0ji

একটি "নিষ্পাপ" অ্যালগরিদম হতে পারে:

 // To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ n-1
       exchange a[j] and a[i]

লুপের মধ্যে যে উপাদানটি অদলবদল করতে হবে তা সমস্ত উপলব্ধ উপাদান থেকে বেছে নেওয়া হয়েছে। তবে এটি অনুমোদনের পক্ষপাতমূলক নমুনা তৈরি করে ( কিছুগুলি অতিরিক্ত উপস্থাপনযোগ্য ইত্যাদি ..)

প্রকৃতপক্ষে একজন সাধারণ (বা নিষ্পাপ ) গণনা বিশ্লেষণ ব্যবহার করে ফিশার-ইয়েটস-নথ শিফলিংয়ের সাথে আসতে পারে ।

nn!=n×n1×n2..nn1

বদলানো অ্যালগরিদমটি সঠিক কিনা ( পক্ষপাতদুষ্ট বা না ) তা যাচাইয়ের মূল সমস্যাটি হ'ল পরিসংখ্যানের কারণে, প্রচুর পরিমাণে নমুনা প্রয়োজন। Codinghorror নিবন্ধ আমি উপরের লিঙ্ক ব্যাখ্যা ঠিক যে (এবং প্রকৃত পরীক্ষা সহ)।


1
একটি শ্যাফেল অ্যালগরিদমের জন্য উদাহরণের নির্ভুলতার প্রমাণের জন্য এখানে দেখুন ।
রাফেল

5

সর্বোত্তম উদাহরণ (পড়ুন: আমি সবচেয়ে বেশি আঘাত পেয়েছি) আমি কোলাটজ অনুমানের সাথে কখনও কখনও দেখেছি। আমি একটি প্রোগ্রামিং প্রতিযোগিতায় ছিলাম (প্রথম স্থানে লাইনে 500 ডলার পুরষ্কার সহ) যার মধ্যে একটি সমস্যা ছিল একই সংখ্যায় পৌঁছানোর জন্য দুটি সংখ্যার জন্য ন্যূনতম পদক্ষেপের সন্ধান করা। সমাধানের সমাধানটি হ'ল পর্যায়ক্রমে প্রতিটিকে পদক্ষেপ নেওয়া যতক্ষণ না তারা উভয়ই এমন কিছু পৌঁছায় যা আগে দেখা গেছে। আমাদের একটি সংখ্যা দেওয়া হয়েছিল (আমি মনে করি এটি 1 এবং 1000000 এর মধ্যে ছিল) এবং বলেছিলাম যে কোলাটজ অনুমানটি 2 ^ 64 পর্যন্ত যাচাই করা হয়েছে সুতরাং আমাদের দেওয়া সংখ্যাগুলি শেষ পর্যন্ত 1 এ রূপান্তরিত হবে। আমি 32-বিট ব্যবহার করেছি যদিও সাথে পদক্ষেপগুলি করতে ইন্টিজার্স। দেখা যাচ্ছে যে 1 এবং 1000000 (170 হাজার কিছু) এর মধ্যে একটি অস্পষ্ট সংখ্যা রয়েছে যা একটি 32-বিট পূর্ণসংখ্যাকে যথাসময়ে ওভারফ্লো করতে বাধ্য করবে। আসলে এই সংখ্যাগুলি অত্যন্ত বিরল বেলো 2 2 31। ওভারফ্লো যে ঘটছে না তা "নিশ্চিত করতে" আমরা 1000000 এরও বেশি বেশি সংখ্যার জন্য আমাদের সিস্টেমটি পরীক্ষা করেছি। একটি খুব ছোট সংখ্যার সন্ধান করে যা আমরা স্রেফ ওভারফ্লো পরীক্ষা করিনি। Becuase আমি "দীর্ঘ" পরিবর্তে "int" ব্যবহার করেছি আমি কেবল 500 ডলার পুরষ্কারের পরিবর্তে 300 ডলার পুরষ্কার পেয়েছি।


5

Knapsack 0/1 সমস্যা এক প্রায় সব ছাত্র মনে করি এটি একটি লোভী আলগোরিদিম দ্বারা সমাধেয় হয়। যদি আপনি আগে ন্যাপস্যাকের সমস্যা সংস্করণ হিসাবে কিছু লোভী সমাধান দেখায় যেখানে লোভী অ্যালগরিদম কাজ করে তবে এটি প্রায়শই ঘটে ।

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

সমস্যা: চোর একটি দোকান ছিনতাই করে এবং তাদের ন্যাপস্যাকের মধ্যে ডাব্লু'র সর্বোচ্চ ওজন বহন করতে পারে। এখানে এন আইটেম এবং আইথ আইটেমের ওজন উই ডাই এবং এর মূল্য vi ডলার। চোর কি জিনিস গ্রহণ করা উচিত? তার লাভ সর্বাধিক ?

ন্যাপস্যাক 0/1 সমস্যা : সেটআপটি সমান, তবে আইটেমগুলি আরও ছোট ছোট টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করার সিদ্ধান্ত নিতে পারে, কিন্তু কোনও আইটেমের ভগ্নাংশ গ্রহণ করতে পারে না ।

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

  • ব্যাগের মোট ক্ষমতা গ্রহণ করুন এবং যথাসম্ভব সর্বাধিক মানযুক্ত বস্তুটি রেখে দিন এবং যতক্ষণ না আপনি বেশি বস্তু রাখতে পারবেন না ততক্ষণ এই পদ্ধতিটি পুনরায় করুন কারণ ব্যাগটি পূর্ণ বা ব্যাগের ভিতরে রাখার জন্য কম ওজনের সমান ওজনযুক্ত বস্তু নেই not
  • অন্য ভুল উপায়ে চিন্তা করা হচ্ছে: হালকা আইটেমগুলি রাখুন এবং এগুলি সর্বোচ্চ থেকে সর্বনিম্ন মূল্যে রাখুন।
  • ...

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


লোভী ইতিমধ্যে গৃহীত উত্তরে coveredাকা ছিল , তবে বিশেষত ন্যাপস্যাক সমস্যাটি কয়েকটি ফাঁদ সেট করতে উপযুক্ত।
রাফেল

3

একটি সাধারণ ভুল হ'ল পরিবর্তিত অ্যালগরিদম ভুল প্রয়োগ করা। উইকিপিডিয়ায় আলোচনা দেখুন ।

n!nn(n1)n


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

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

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

1
@ পের অ্যালেক্সানডারসন: এমনকি যদি আপনি কেবল একটি মাত্র শ্যাফেল তৈরি করেন তবে এম> এনটি> 2080 সহ এটি ব্যবহার করে সত্যই এলোমেলো হতে পারে না Now আপনি পিরিয়ডের তুলনায় অনেক কম উত্পাদন করেন (উপরে asmeurer পয়েন্ট হিসাবে)।
চার্লস

2
এই উত্তরটি নিকোস এম এর আরও বিস্তৃত কোনও দ্বারা অচল হয়ে গেছে বলে মনে হয় ?
রাফেল

2

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

def variance(data):
        # Use the Computational Formula for Variance.
        n = len(data)
        ss = sum(x**2 for x in data) - (sum(data)**2)/n
        return ss/(n-1)

উপরেরগুলি নৈমিত্তিক পরীক্ষার মাধ্যমে সঠিক বলে মনে হচ্ছে:

>>> data = [1, 2, 4, 5, 8]
>>> variance(data)
  7.5

তবে প্রতিটি ডেটা পয়েন্টে একটি ধ্রুবক যুক্ত করা ভেরিয়েন্স পরিবর্তন করা উচিত নয়:

>>> data = [x+1e12 for x in data]
>>> variance(data)
  0.0

এবং বৈকল্পিকতা কখনই নেতিবাচক হওয়া উচিত নয় :

>>> variance(data*100)
  -1239429440.1282566

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


1
n1

2
@ রাফেল: যদিও তা ন্যায্য, তবে নির্বাচিত অ্যালগরিদম ভাসমান-পয়েন্টের ডেটার জন্য দুর্বল পছন্দ হিসাবে সুপরিচিত।

2
এটি কেবল সংখ্যার বিষয়ে এবং কীভাবে নির্ভুলতা হারিয়ে যায় সে সম্পর্কে অপারেশন বাস্তবায়নের বিষয়ে নয়। আপনি যদি সর্বাধিক নির্ভুলতা চান তবে আপনাকে অবশ্যই আপনার ক্রিয়াকলাপকে একটি নির্দিষ্ট উপায়ে অর্ডার করতে হবে। বিশ্ববিদ্যালয়ে আমার সংখ্যার কোর্সটি ছিল এমন একটি বিষয়।
খ্রিস্টান

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

1

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

nn2+n+410<dd divides n2+n+41d<n2+n+41

প্রস্তাবিত সমাধান :

int f(int n) {
   return 1;
}

n=0,1,2,,39n=40

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


5
আমি এটি খুব ভাল উদাহরণ বলে মনে করি না, কারণ খুব কম লোকই 1 এ ফিরে বহুবর্ষীয় বিভাজনকারীদের সন্ধান করার চেষ্টা করবে
ব্রায়ান এস

1
nn3n

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

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

ঠিক আছে, হ্যাঁ, তবে এটি বর্ণিত হিসাবে তুচ্ছ (সম্ভবত সাধারণত সঠিক), তবে প্রশ্নের উদ্দীপনা নয়। তবুও পুনর্নির্মাণের প্রয়োজন হবে
নিকস এম।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.