প্যাথোলজিকাল বাছাই


15

প্যাথোলজিকাল বাছাই

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

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

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

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

এটি একটি , সুতরাং 7 দিনের (21 ই মে) পরে সর্বাধিক ভোটের উত্তর জিতেছে।

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


এই প্রশ্নটির কাছে যারা আসছেন তাদের পক্ষে সম্ভবত দরকারী / আকর্ষণীয় সংস্থান: "সাইকিক সোর্টিং অ্যালগরিদম" (অস্বীকৃতি: সেই নিবন্ধটির লেখক এবং আমি খুব নিকটেই। :
পি

উত্তর:


9

এটি বেশ দীর্ঘ সময় হয়ে গেছে, তবে আমি মনে করি আবার অ্যালগরিদম 101-এ ফিরে এসেছিলাম যা আমাদের কিছু বাছাই করা অ্যালগরিদম শিখিয়েছিল যা এলোমেলোকরণ ব্যবহার করে। আমি খুব ভাল ছাত্র ছিলাম না সুতরাং এটি কীভাবে গেল বা কেন এটি গড়ে গড়ে দ্রুত কাজ করে তা সত্যি মনে নেই।

তবুও, আমি সিদ্ধান্ত নিয়েছি যে এই সমস্যাটি এমন একটি সমাধানের জন্য যা র্যান্ডমাইজেশন ব্যবহার করে, যা আশা করি গড়ে আমার পক্ষে কাজ করবে।

import random

def arrayIsSorted (arr) :
    for i in range(len(arr)-1) :
        if arr[i]>arr[i+1] : return False
    return True

def rSort (arr) :
    random.seed (42)
    counter = 0
    while not arrayIsSorted(arr) :
        random.shuffle (arr)
        counter+=1
    print ("Sorted in %d iterations." % counter)
    return arr

যেহেতু সত্যিকারের র্যান্ডমাইজেশন গুরুত্বপূর্ণ, তাই আমি জীবন, মহাবিশ্ব এবং সমস্ত কিছুর উত্তর দিয়ে আরএনজি বীজ করে ফেলা নিশ্চিত করি। কিছুটা পরীক্ষার পরে দেখা গেল যে এটি একটি স্মার্ট চাল! এই 2 সম্পূর্ণ স্বেচ্ছাচারিত তালিকাগুলি কত দ্রুত বাছাই করা যায় তা দেখুন:

rSort ([6,1,4,2,3,7,5])
rSort ([8,9,6,1,4,7,2,3,5])

এই দুটিই কেবল 1 টি পুনরাবৃত্তিতে সাজানো হয় - আপনি সম্ভবত এর চেয়ে দ্রুত কোনও কার্যকারিতা চাইতে পারেন না!

এখন, স্বীকারোক্তি হিসাবে, অন্য কয়েকটি তালিকার কিছুটা খারাপ ফলাফল আসে ...

rSort ([5,1,4,2,3,7,6])
rSort ([8,9,6,1,4,7,2,5,3])

এগুলি যথাক্রমে 4,176 এবং 94,523 পুনরাবৃত্তিতে সাজানো হয়, যা আসলে এক সেকেন্ডেরও বেশি সময় নেয় ... তবে আসুন আমরা এই সত্যটি নিজের কাছে রাখি যাতে এই অ্যালগরিদমটি কত আশ্চর্যজনক থেকে কাউকে বিভ্রান্ত না করে!

সম্পাদনা:

আমাকে 100 আইটেমের তালিকায় আমার অ্যালগরিদমের দক্ষতা প্রমাণ করতে বলা হয়েছে, সুতরাং আপনি এখানে যান:

rSort ([70, 6, 52, 97, 85, 61, 62, 48, 30, 3, 11, 88, 39, 91, 98, 8, 54, 92, 44, 65, 69, 21, 58, 41, 60, 76, 27, 82, 93, 81, 20, 94, 22, 29, 49, 95, 40, 19, 55, 42, 43, 1, 0, 67, 35, 15, 51, 31, 16, 25, 5, 53, 37, 74, 86, 12, 13, 72, 56, 32, 47, 46, 59, 33, 80, 4, 45, 63, 57, 89, 7, 77, 14, 10, 34, 87, 18, 79, 9, 66, 24, 99, 64, 26, 78, 38, 90, 28, 83, 75, 68, 2, 17, 73, 96, 71, 23, 84, 36, 50])

এমনকি এই দীর্ঘ এবং সম্পূর্ণ স্বেচ্ছাসেবী তালিকা তাত্ক্ষণিকভাবে সাজানো হয়! সত্যিই আমি অবশ্যই বিশ্বের সেরা বাছাই করা অ্যালগরিদমকে হোঁচট খেয়েছি!


3
আমরা কি কিছুটা বড় ডেটাসেটগুলিতে কিছু পরীক্ষার ফলাফল পেতে পারি? 100 উপাদান সহ একটি হতে পারে? ;)
জিওবিটস

কোন সমস্যা নেই @Geobits, এখানে এটা :)
তাল

1
@ জিওবিটস হ্যাঁ এটি করে। অবশেষে.
তাল

3
এটি একটি প্রসারিত, তবে এটি যুক্তিযুক্ত হতে পারে যে এটি বোগোসর্ট ব্যবহার করে, যা শেষ পর্যন্ত অ্যারেটিকে পর্যাপ্ত সময় দেয় বাছাই করবে। আমি বাছাই করতে ইচ্ছুক যে 'পরিবর্তন এবং পুনরাবৃত্তি' asorting হিসাবে যোগ্যতা অর্জন, যদিও ভাল বাছাই না।
মিলিনন

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

2

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

একটি সহজ উপায় প্রতিটি তথ্য আইটেমের একটি অনন্য কী আছে তা নিশ্চিত করা এবং তারপরে কীগুলি কেবল হ্যাশ করা হয়। উদাহরণস্বরূপ 1-10,000 এর সংখ্যার সাথে একটি তালিকা নিন, সমস্তটি 16 দ্বারা গুণিত হয়েছে এবং 0-15 থেকে একটি এলোমেলো সংখ্যার সাথে এতে যুক্ত হয়েছে ( নীচে পূরণ করুন () দেখুন। তারা এলোমেলো দেখবে, তবে প্রত্যেকেরই একটি অনন্য ধারাবাহিক কী রয়েছে। বাছাইয়ের জন্য, 16 দ্বারা বিভক্ত করুন (সি এর মধ্যে >> 4 খুব দ্রুত) এবং তারপরে ফলাফলটিকে কী হিসাবে সূচক হিসাবে ব্যবহার করে কেবল একটি অ্যারেতে নম্বরটি রাখুন। একটি পাস এবং আপনি শেষ। পরীক্ষায়, আমি দেখতে পেলাম যে দশ মিলিয়ন সংখ্যায় কুইকোর্টটি 30 গুণ ধীর ছিল।

void fillArray(int *a,int len)
{
  for (int i=0;i<len;++i)
    a[i]=(i<<4)|(rand()&0xF);
  // shuffle later
}
void sortArray(int *a,int len)
{
  int key=0;
  int *r=new int[len];
  for (int i=0;i<len;++i)
  {
    key=a[i]>>4;
    r[key]=a[i];
  }
  memcpy(a,r,len*sizeof(int));
  delete[] r;
}
void shuffleArray(int *a,int len)
{
  int swap=0, k=0;
  for (int i=0;i<len;++i)
  {
    k=rand()%len;
    swap=a[k];
    a[k]=a[i];
    a[i]=swap;
  }
}
int qCompare(const void*a,const void*b)
{
  int result=*((int*)a)-*((int*)b);
  return result;
}
void main()
{
  int aLen=10000;
  int *a=new int[aLen];
  srand (time(NULL));
  fillArray(a,aLen);
  // time them
  long t0=0, d0=0, d1=0;
  // qsort
  shuffleArray(a,aLen);
  t0=::GetTickCount();
  qsort(a,aLen,sizeof(int),&qCompare);
  d0=::GetTickCount()-t0;
  // oursort
  shuffleArray(a,aLen);
  t0=::GetTickCount();
  sortArray(a,aLen);
  d1=::GetTickCount()-t0;
  delete[] a;
}

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

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