تالار گفتمان مانشت
[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - نسخه‌ی قابل چاپ

صفحه‌ها: ۱ ۲
[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 30 آبان ۱۳۸۹ ۰۹:۰۵ ب.ظ

به زودی راه اندازی می شود
شما هم‌، هر کمکی تونستید، دریغ نکنید

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 10 آذر ۱۳۸۹ ۰۹:۳۹ ب.ظ

ادغام ۲ هیپ که جمعاً n عنصر دارد از مرتبه(O(n هست.

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 12 آذر ۱۳۸۹ ۰۲:۳۵ ب.ظ

به یاد داشته باشید که پیمایش های BFS , DFS منحصر بفرد نیستند.

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 18 آذر ۱۳۸۹ ۱۰:۱۱ ب.ظ

(۱۰ آذر ۱۳۸۹ ۰۹:۳۹ ب.ظ)Masoud05 نوشته شده توسط:  ادغام ۲ هیپ که جمعاً n عنصر دارد از مرتبه(O(n هست.

لطفاَ به لینک زیر یه نگاهی بندازین:

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.

توجه‌: این فایل زبان اصلیه اما ترجمه اون خیلی راحته . حجمش هم حدوداً ۸۸ کیلو بایته

[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - امیدوار - ۰۱ دى ۱۳۸۹ ۰۲:۳۸ ب.ظ

ادغام دو هیپ نا متوازن را می توان درLgn انجام داد.

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 02 دى ۱۳۸۹ ۰۲:۴۶ ب.ظ

یک آرایه نزولی یک هیپ است ولی عکس آن لزوماً صحیح نیست.
علت (از خودم): در آرایه نزولی‌، به ازای هر i<j مقدار درون خانه i از j بزرگتر است پس لزوماً والد گره i که اندیسی کوچکتر از i دارد( چراکه در سطح بالاتری از درخت نسبت به گره i قرار گرفته )
باید مقدارش بزرگتر از i باشد. اما یک هیپ لزوماً یک آرایه نزولی نیست چراکه فرض کنید در سطح ۲( بعد از ریشه، ریشه سطح۱ فرض شده )کافی است مقادیر کوچکتر از ریشه باشد و قیدی نداریم که فرزند راست نسبت به فرزند چپ مقدارش کمتر یا بیشتر باشد‌، پس ممکن است مقدار زیر درخت چپ از راست بزرگتر باشد که باعث میگردد هنگام نمایش در آرایه مقدار درون اندیس i+1 از مقدار درون اندیس i بزرگتر باشد( نزولی نیست)
نکته بالا برای MaxHeap بود اما برای MinHeap هم وضیعتی به همین صورت داریم فقط با این تفاوت که آرایه صعودی است.

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 06 دى ۱۳۸۹ ۱۱:۵۴ ب.ظ

ساخت هیپ از مرتبه (O(n می باشد( به روش پایین به بالا)
از هیپ برای مرتب سازی عناصر به نحو زیر استفاده می شود
۱- بسته به نوع مرتب سازی یک هیپ می سازیم که به زمان( O(n نیاز دارد . در واقع برای مرتب سازی صعودی یک هرم کمینه و برای مرتب سازی نزولی یک هرم بیشینه می سازیم.
۲- n عنصر را به ترتیب از هیپ حذف می کنیم که به زمان nlogn نیاز دارد
پس مرتبه کل بصورت( O(nlognمی باشد( جمع ۲ عمل بالا)

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - ۵۴m4n3h - 07 دى ۱۳۸۹ ۱۲:۰۳ ق.ظ

نکات زیر در مورد Heap در واقع تمرینات بخش ۶/۱ CLRS هست:

۱/ مینیمم تعداد گره‌ها در یک heap به ارتفاع h برابر است با [تصویر:  gif.download?2^{h}]

۲/ ماکزیمم تعداد گره‌ها در یک heap به ارتفاع h برابر است با [تصویر:  gif.download?2^{h+1}-1]

۳/ در یک Max-Heap کوچکترین عنصر همیشه یک برگ است.

۴/ در یک آرایه‌ی heap که n عنصر دارد، برگ‌ها در اندیس های n/2 به بعد آرایه قرار دارند، یعنی اندیس برگ‌ها عبارت است از [تصویر:  2&amp;space;\right&amp;space;\rf...;space;...]

[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - ف.ش - ۰۷ دى ۱۳۸۹ ۱۲:۰۴ ق.ظ

نکته مهم ولی ساده از min-heap برای استخراج متوالی min‌ها , از max heap برای استخراج متوالی max‌ها استفاده میشود و heap در امر جستجو کارایی ندارد!

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 07 دى ۱۳۸۹ ۱۲:۱۲ ق.ظ

(۰۷ دى ۱۳۸۹ ۱۲:۰۴ ق.ظ)afagh1389 نوشته شده توسط:  نکته مهم ولی ساده از min-heap برای استخراج متوالی min‌ها , از max heap برای استخراج متوالی max‌ها استفاده میشود و heap در امر جستجو کارایی ندارد!
خود هیپ به تنهایی معنی نداره‌، در واقع هرگاه اسم هیپ میاد منظور یکی از این ۲ حالت بیشینه و یا کمینه هست . برای مرتب سازی هم در ارسال ۷ توضیح داده شده
در ضمن اگه مشخص نباشه نوع هیپ چیه معمولاً منظور هیپ بیشینه است اما در مسائلی مثل صف اولویت و یا ادغام لیست های مرتب منظور هیپ کمینه است

[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - sepid - 07 دى ۱۳۸۹ ۱۱:۳۰ ب.ظ

تمرین ۱۲/۵/۳ CLRS:
عمل حذف در BST جابه جایی پذیر نیست.

RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - Masoud05 - 07 دى ۱۳۸۹ ۱۱:۳۹ ب.ظ

(۰۷ دى ۱۳۸۹ ۱۱:۳۰ ب.ظ)sepid نوشته شده توسط:  تمرین ۱۲/۵/۳ CLRS:
عمل حذف در BST جابه جایی پذیر نیست.
عمل درج نیز جا به جایی پذیر نیست . دقیقاً به همین علته که ارتفاع درخت BST بین log n و n هست
اما در Treap عمل درج و حذف جابه جا پذیره چراکه با هر نوع جایگشت از ورودی‌ها درخت حاصل شکل منحصر بفردی دارد.

[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 02 اردیبهشت ۱۳۹۱ ۰۲:۰۴ ق.ظ

گراف دوبخشی

گراف‌های دوبخشی به گراف‌هایی گفته می‌شوند که رأس‌ها به دو دسته مجزا قابل افراز هستند
بگونه‌ای که تمامی یال‌های گراف بین گره‌های بین دو دسته مختلف باشند.

مثالی از یک گراف دو بخشی
[تصویر:  200px-Simple-bipartite-graph.svg.png]
خواص مهم

یک گراف دو بخشی است اگر و فقط اگر تمامی دورهای از طول زوج باشند.
بنابراین به عنوان مثال یک گراف دو بخشی نمی‌تواند شامل یک گراف کامل با ۳ رأس باشد.

یک گراف دو بخشی است اگر و فقط اگر ۲-رنگ پذیر باشد.
گراف پترسن

گراف پترسن یک گراف بدون جهت با ۱۰ رأس و ۱۵ یال است. گرافی کوچک که مثال و مثال نقض مفیدی برای خیلی از مسائل در نظریه گراف است. این گراف به جولیوس پترسن نسبت داده شده ولی در حقیقت برای اولین بار ، ۱۲ سال زودتر در سال ۱۸۸۶ به وجود آمده بود.

تعداد رأس‌ها:۱۰ تعداد یال‌ها: ۱۵ قطر:۲ مینیمم طول دور:۵

عدد رنگی:۳ اندیس رنگی:۴ منتظم غیرمسطح

گراف پترسن، گراف مکمل گراف خط است. همچنین گراف کنزر است به این معنا که اگر برای هر کدام از زیرمجموعه‌های دو عضوی یک مجموعهٔ ۵ عضوی یک رأس در نظر بگیریم و بین هر دو رأسی که زیرمجموعه‌ها ی نظیرشان ناسازگار باشند یک یال وصل کنیم، گراف پترسن ساخته می‌شود.

گراف پترسن هم با گراف کامل و هم با گراف دوبخشی کامل همومورف است.

مسیرها و دورهای همیلتونی

گراف پترسن مسیر هامیلتونی دارد ولی دور هامیلتونی ندارد. گراف پترسن کوچکترین گراف شبه هامیلتونی است یعنی اگرچه دور هامیلتونی ندارد، هر کدام از رأس‌هایش که حذف شوند می‌توان یک دور هامیلتونی در آن پیدا کرد.

عدد تقاطع گراف پترسن ۲ است .

گراف پترسن همچنین می‌تواند در صفحه به گونه‌ای رسم شود که همهٔ یال‌ها طول یکسان برابر واحد داشته باشند.[شکل ۳]

[تصویر:  82803_1_1379093341.JPG] [تصویر:  82803_2_1379093341.JPG] [تصویر:  82803_3_1379093341.JPG] [تصویر:  82803_4_1379093341.JPG] [تصویر:  82803_5_1379093341.JPG]

نامگذاری به نام:*******عدد تقاطع گراف**گراف پترسن در صفحه******* گراف پترسن شبه ****** عدد رنگی گراف
جولیوس پترسن*******پترسن ۲ است**می‌تواند به گونه‌ای رسم****** هامیلتونی است ****** پترسن ۳ است
 ******************************شود که طول هر
****************************** یال برابر واحد باشد

منبع :به نظر قبلا از ویکی پدیا گرفتم


RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 03 اردیبهشت ۱۳۹۱ ۰۱:۵۸ ق.ظ

این مطلب در مورد پیمایش گراف هاست .

[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 04 اردیبهشت ۱۳۹۱ ۰۵:۴۸ ق.ظ

درخت های جست و جوی دودویی ( BST = Binary Search Tree )


یک درخت جستجوی یک درخت دودویی است که ممکن است تهی باشد. اگر درخت تهی نباشد خصوصیات زیر را برآورده می کند :

  • هر عنصر دارای یک کلید است و دو عنصر نباید دارای کلید یکسان باشند ، در واقع کلیدها منحصر به فردند.
  • کلیدهای واقع در زیردرخت غیرتهی چپ باید کمتر از مقدار کلید واقع در ریشه زیردرخت راست باشد.
  • کلیدهای واقع در زیردرخت غیرتهی راست باید بزرگتر از مقدار کلید واقع در ریشه زیردرخت چپ باشد.
  • یک درخت جستجوی یک درخت دودویی است که ممکن است تهی باشد. اگر درخت تهی نباشد خصوصیات زیر را برآورده می کند :
  • زیردرختان چپ و راست نیز خود درختان جستجوی دودویی میباشند.


جستجوی یک درخت دودویی


  • فرض کنید خواسته باشیم دنبال عنصری با کلید key بگردیم. ابتدا از ریشه (root) شروع می کنیم ، اگر ریشه تهی باشد ، درخت جستجو فاقد هر عنصری بوده و جستجو ناموفق خواهد بود. در غیر این صورت keyرا با با مقدار کلید ریشه مقایسه کرده
  • اگر key کمتر از مقدار کلید ریشه باشد ، هیچ عنصری در زیردرخت راست وجود ندارد که دارای کلیدی برابر key باشد ، بنابراین زیردرخت چپ ریشه را جستجو می کنیم.
  • اگر key بزرگتر از مقدار کلید ریشه باشد ، زیردرخت راست را جستجو می کنیم.
******** اگر h ارتفاع یا عمق یک درخت جستجوی دودویی باشد ، عمل جستجو را در مدت O(h) انجام می شود. ***********


درج عنصری به داخل درخت جستجوی دودویی

برای درج عنصر جدیدی به نام key ، ابتدا باید مشخص نمود که آیا کلید با عناصر موجود متفاوت است یا خیر. برای انجام این کار باید درخت را جستجو کرد، اگرجستجو ناموفق باشد ، عنصر را در محلی که جستجو خاتمه پیدا نموده است ، درج می کنیم.

زمان لازم برای جستجوی num در یک درخت برابر (O(h می باشد به نحوی که h برابر با عمق یا ارتفاع درخت است. بقیه الگوریتم نیاز به زمان (Θ(۱ دارد. بنابراین زمان کل مورد نیاز insert_node برابر با (Θ(h می باشد.

زمانی که یک گره برگ با دو فرزند حذف می شوند ، گره را با بزرگترین عنصر در زیر درخت چپ و یا کوچکترین عنصر در زیردرخت راست آن گره جایگزین و تعویض کرد.

عمل حذف در زمان (O(h انجام می گیرد ، به نحوی که h عمق درخت می باشد.



****** درختان جستجو با بیشترین عمق ، درختان جستجوی متعادل نامیده می شوند.

****** درختان جستجوی متعادلی وجود دارند که عمل جستجو ، درج و حذف را در زمان (O(h ممکن می سازند

از جمله درختان red_black ، ۲-۳ ، AVL


نقل قول: جستجوی کلید در درخت دودویی
کد:
void search ( node _  pointer tree ,
                       keytype  keyin,
                       node _ poiner & p)
     {
           bool found ;
           p = tree;
           found = false;
           while (! found)
if ( p - > key == keyin )
                 found = true ;
        else if ( keyin < p - > key )
                  p = p  -> left ;
        else
                p = p - > right ;
    }

نقل قول: تعیین یک درخت جست وجوی بهینه برای مجموعه ای از کلید ها، هر یک با احتمالی مشخص
کد:
void optsearchtree  ( int n ,
                                  const  float  p[];
                                  float & minavg,
                                  index   R[][])
      {
             index  i , j , k , diagonal ;
     float A [1..n + 1] [0..n];
     for ( i = 1 ; i ≤ n ; i ++) {
             A [i] [i -1] = 0
             A [i] [i]  = p [i];
              R [i] [i] = i ;
              R [i] [ i – ۱ ] = ۰;
     }
          A[ n + 1 ] [n] = 0 ;
          R[ n + 1 ] [n] = 0 ;
  for (diagonal = 1;diagonal ≤ n – ۱; diagonal++)
              for  ( i = 1; i ≤ n – diagonal ; i ++) {
                 j = i + diagonal ;
                A[i][j] = minimum(A[i][k-1]+A[k+1][j])+∑pm                
                R[i][j] = a value of k that gave the minimum;
               }
         minavg = A [1][n];
      }
نقل قول: ساخت درخت جست و جوی دودویی بهینه
کد:
node _ pointer tree ( index i , j )
  {
       index k ;
       node _ pointer p ;
       k = R [i] [j];
       if ( k == 0 )
                return NULL;
       else   {
p =  new nodetype ;
     p - > key = key [k] ;
     p - > left = tree (i , k – ۱);
     p - > right = tree ( k+1 , j);
     return  P;
         }
     }