1 / 22

Data Structures ساختمان داده ها

Data Structures ساختمان داده ها. مظفر بگ محمدی دانشکده فنی دانشگاه ایلام. Grading. کتاب: ساختمان داده ها به زبان C++ نوشته: هورویتز- ساهنی – مهتا ترجمه: امیر علیخان زاده انتشارات خراسان نمره: تمرین: 15% برنامه نويسي: 15% میان ترم: 35% پایان ترم: 35%. Cautions.

minh
Download Presentation

Data Structures ساختمان داده ها

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Data Structuresساختمان داده ها مظفر بگ محمدی دانشکده فنی دانشگاه ایلام

  2. Grading • کتاب: • ساختمان داده ها به زبان C++ • نوشته: هورویتز- ساهنی – مهتا • ترجمه: امیر علیخان زاده • انتشارات خراسان • نمره: • تمرین: 15% • برنامه نويسي: 15% • میان ترم: 35% • پایان ترم: 35%

  3. Cautions • کپی کردن از روی تمرین دیگران با نمره صفر (هم برای کپی کننده و هم برای کسی که حل تمرین را در اختیار دیگران قرار دهد) مواجه خواهد شد. • گروههای بیش از دو نفر مجاز نیستند. • خطای گروههای سه نفره در 1.5 ضرب خواهد شد. • مثال: اگر درصد پاسخ صحیح 80 درصد باشد، نمره گروه سه نفره فرضی برابر 70 خواهد بود.

  4. Outline • Recursion • Algorithm complexity • Arrays vs. Linked List • Stacks • Queues • Trees • Binary trees, heaps, search trees, • Graphs • Spanning tree, minimum spanning tree, shortest path tree, • Sorting • Quick sort, Insertion sort, heap sort, merge sort, radix sort • Hashing

  5. بازگشت

  6. Recursion: Definition • تابعي که براي حل مساله، از خودش براي حل يک نسخه کوچکتر از همان مساله استفاده مي کند. • نيازمند شرط پايان است: حالتي که ديگر به بازگشت نيازي نداريم

  7. Factorial Recursion • Factorial: n! = n * (n-1)! • شرط خاتمه => 0! = 1 • مساله کوچکتر => Solving (n-1)! • Implementation: long factorial(long inputValue) { if (inputValue == 0) return 1; else return inputValue * factorial(inputValue - 1); }

  8. Searching • مي خواهيم ببينيم که ورودي در ليست مرتب داده شده است يا نه؟ 8 in [1, 2, 8, 10, 15, 32, 63, 64]? 33 in [1, 2, 8, 10, 15, 32, 63, 64]? ------------------------------------------------------ int index = 0; while (index < listSize) { if (list[index] == input) return index; index++; } return –1;

  9. Searching • راه حل بهتر؟ • از اين واقعيت که ليست مرتب است استفاده کنيد. • هر بار مساله را نصف مي کنيم • با عنصر وسطي مقايسه مي کنيم. • اگر بزرگتر بود، مقدار مورد نظر ما در سمت راست عنصر وسط قرار دارد. • اگر کوچکتر بود، مقدار مورد نظر ما در سمت چپ عنصر وسط قرار دارد. • اگر مساوي بود، عنصر مورد نظر پيدا شده است.

  10. Searching: Binary Search for (int left = 0, right = n –1; left <= right;) { middle =(left + right) / 2; if (input == list[middle]) return middle; else if (input < list[middle]) right = middle – 1; else left = middle + 1; } return – 1;

  11. Searching: Binary Search 8 in [1, 2, 8, 10, 15, 32, 63, 64]? 1st iteration: Left = 0, Right = 7, Middle = 3, List[Middle] = 10 Check 8 == 10 => No, 8 < 10 2nd iteration: Left = 0, Right = 2, Middle = 1, List[Middle] = 2 Check 8 == 2 => No, 8 > 2 3rd iteration: Left = 2, Right = 2, Middle = 2 Check 8 == 8 => Yes, Found It!

  12. Searching: Binary Search • روش جستجوي دودويي: • تعداد اعمال مورد نياز براي پيدا کردن ورودي اگر در ليست باشد: • وابسته به محل ورودي در ليست است. • اگر در وسط باشد  1 عمل • حداکثر Log2 n عمل • تعداد اعمال مورد نياز براي پيدا کردن ورودي اگر در ليست نباشد: • هميشه Log2 n عمل

  13. Recursive Binary Search • شرايط بازگشت: • مساله کوچکتر و مشابه • شرط خاتمه • جستجوي دودويي: • جستجو در نصف آرايه قبلي • وقتي اندازه آرايه 1 شد، متوقف شويد.

  14. Recursive Binary Search int BinarySearch(int *list, const int input, const int left, const int right) { if (left < right) { middle =(left + right) / 2; if (input == list[middle]) return middle; else if (input < list[middle]) return BinarySearch (list, input, left, middle-1); else return BinarySearch (list, input, middle+1, right); } return – 1; }

  15. Fibonacci Computation • دنباله فيبوناچي: • 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … • تعريف ساده: • Fib[0] = 1 • Fib[1] = 1 • Fib[N] = Fib(N-1) + Fib(N-2)

  16. Recursive Fibonacci int fibonacci(int input) { if ((input == 0) || (input == 1)) return 1; else return (fibonacci(input-1) + fibonacci(input-2)); }

  17. Iterative Fibonacci int fibonacci(int input) { int first = 1; int second = 1; int temp; for (int k = 0; k < input; k++) { temp = first; first = second; second = temp + second; } return first; }

  18. Types of Recursion • بازگشت خطي: • يک بار صدا زدن تابع بازگشتي در هر مرحله • مثال:Factorial, Binary Search • بازگشت درختي: • چند بار صدا زدن تابع بازگشتي در هر مرحله • مثال:Fibonacci

  19. Efficiency of Recursion • بعضي اوقات روش بازگشتي از روش تکراري کندتر است. • دو دليل اصلي: • استفاده از پشته برنامه • وقتي يک تابع بازگشتي را صدا مي زنيم به پشته برنامه اضافه مي گردد. • توليد جوابها

  20. Efficiency of Recursion • استفاده از پشته: • وقتي برنامه يک تابع را صدا مي زند، آن تابع به پشته برنامه اضافه مي گردد. • هر رديف از پشته شامل موارد زير است: • محل بازگشت در برنامه بعد از پايان تابع • ذخيره متغييرهاي محلي • کپي يا اشاره گر به مقادير آرگومانهايي که به تايع فرستاده شده اند. readFile() Returns file data to be used in getData() getData() main() Returns formatted data to be printed in main()

  21. Efficiency of Recursion • دليل ديگر کندي روش بازگشتي (روش درختي): • Fib(5) = Fib(4) + Fib(3) = Fib(3) + Fib(2) + Fib(3) = Fib(2) + Fib(1) + Fib(2) + Fib(3) = Fib(1) + Fib(0) + Fib(1) + Fib(2) + Fib(3) = Fib(1) + Fib(0) + Fib(1) + Fib(1) + Fib(0) + Fib(3) = Fib(1) + Fib(0) + Fib(1) + Fib(1) + Fib(0) + Fib(2) + Fib(1) = Fib(1) + Fib(0) + Fib(1) + Fib(1) + Fib(0) + Fib(1) + Fib(0) + Fib(1) • راه حل: برنامه نويسي ديناميک – ذخيره جوابها و استفاده مجدد از آنها

  22. Dynamic Programming • مساله فيبوناچي • ما تعداد جوابهاي مياني را مي دانيم. • مثلا Fibonacci (60)شست جواب مياني دارد. • يک آرايه با طول شست ايجاد کرده و به تمام عناصر آن مقدار 1- مي دهيم. • هر گاه جوابي را پيدا کرديم در آرايه ذخيره مي کنيم. • لذا، وقتي که دنبال يک جواب مي گرديم، اول آرايه را چک مي کنيم اگر مقداري غير از يک در آن قرار داشت از آن استفاده مي کنيم.

More Related