دانلود pdf ساختمان داده و الگوریتم کمیاب و عالی
در حوزه علوم کامپیوتر، مطالعه عمیق ساختمان داده و الگوریتم اساسی است، زیرا به درک چگونگی سازماندهی دادهها و پردازش کارآمد آنها میپردازد. برای شروع در این مسیر، ابتدا باید با پیشنیازهایی آشنا شد که شامل مفاهیم پایهای برنامهنویسی و تفکر منطقی است.
یکی از مباحث اولیه و مهم، مرتبسازی (Sorting) است که به روشهای مختلفی برای چینش عناصر میپردازد؛ از جمله روشهای مرتبسازی (Sort Methods) و درج یک عنصر (کلی) که مقدمهای بر مرتبسازی درجی (Insertion Sort) خواهد بود.

پس از مرتبسازی، تحلیل پیچیدگی (Complexity) الگوریتمها از اهمیت بالایی برخوردار است که شامل شمارش مقایسه (Comparison Count) و شمارش مقایسه در بدترین حالت (Worst-Case Comparison Count) است. شمارش گامها (Step Count) نیز به ما کمک میکند تا زمان اجرای الگوریتمها را برآورد کنیم.
محاسبه پیچیدگی در مرتبسازی درجی نشان میدهد که چگونه عملکرد یک الگوریتم با افزایش حجم دادهها تغییر میکند، و اینجاست که اهمیت کامپیوتر سریعتر در مقابل الگوریتم بهتر روشن میشود.
نوع فایل: پی دی اف – 387 صفحه
فهرست مطالب:
- ساختمان داده و الگوریتم
- در مورد ساختمان داده
- محاسبه پیچیدگی در مرتب سازی درجی
- Faster Computer Vs Better Algorithm
- Data Structure
- Data Object
- Linear (or Ordered) Lists
- Examples of Linear Lists
- Linear List Operations: Size
- Linear List Operations: Get
- Linear List Operations: IndexOf
- Linear List Operations: Remove
- Data Structure Specification
- Linear List Abstract Data Type
- Data Representation Methods
- Linear List Array Representation
- Right to Left Mapping
- Mapping That Skip Every Other Position
- Wrap Around Mapping
- Representation Used In Text
- Add/Remove An Element (Array List)
- Length of Array Element
- Linear List As Java Abstract Class
- Linked Representation (General)
- Memory Layout
- Normal Way To Draw A Linked List
- Chain (Linked List)
- Node Representation (Chain)
- Constructors Of ChainNode
- Get Operation (ChainNode)
- NullPointerException
- Remove Operation (ChainNode)
- Add Operation (ChainNode)
- The Class Chain
- Constructors (Class Chain)
- The Method isEmpty
- The Method size()
- The Method checkIndex
- The Method get
- The Method indexOf
- Chain With Header Node
- Empty Chain With Header Node
- Circular List
- Doubly Linked List
- Doubly Linked Circular List
- Doubly Linked Circular List With Header Node
- Empty Doubly Linked Circular List With Header Node
- Arrays
- 1D Array Representation In C, and C++
- Space Overhead (Arrays)
- 2D Arrays
- Rows Of A 2D Array
- Columns Of A 2D Array
- 2D Array Representation (C/C++)
- 2D Array Representation (Java/C/C++)
- Row-Major Mapping
- Column-Major Mapping
- Sparse Matrices
- Representation Of Unstructured Sparse Matrices
- Single Linear List Example
- Array Linear List Representation
- Chain Representation
- Single Chain
- One Linear List Per Row
- Array Of Row Chains
- Orthogonal List Representation
- Row Lists
- Column Lists
- Orthogonal Lists
- Variations
- Stacks
- Stack Of Cups
- The Interface Stack
- Parentheses Matching
- Parentheses Matching Example
- Towers Of Hanoi/Brahma
- Towers of Hanoi: Recursive Solution
- Derive From A Linear List Class
- Derive From ArrayLinearList (Stack)
- Derive From Chain (Stack)
- Stack Operations: empty() & peek()
- Stack Operations: push() & pop()
- A Faster pop()
- Stack Implementation: Push
- Stack Implementation: Pop
- Linked Stack From Scratch
- Stack Performance
- Queues
- Bus Stop Queue
- The Interface Queue
- Derive From ArrayLinearList (Queue)
- Derive From ExtendedChain (Queue)
- Custom Array Queue
- Add An Element (Custom Array Queue)
- Remove An Element (Custom Array Queue)
- Moving rear Clockwise
- Empty That Queue
- A Full Tank Please
- Queue Edge Cases
- Trees
- Nature Lover’s View Of A Tree
- Computer Scientist’s View
- Linear Lists And Trees
- Hierarchical Data And Trees
- Tree Classes Example
- Tree Definition
- Subtrees
- Leaves
- Parent, Grandparent, Siblings, Ancestors, Descendants
- Levels
- Tree Levels: Caution
- Tree Height, Depth, and Levels
- Node Degree = Number Of Children
- Tree Degree = Max Node Degree
- Binary Tree
- Differences Between A Tree & A Binary Tree
- Arithmetic Expressions
- Operator Degree
- Infix Form
- Operator Priorities
- Tie Breaker
- Infix Expression Is Hard To Parse
- Postfix Form
- Postfix Examples
- Unary Operators
- Postfix Evaluation
- Prefix Form
- Binary Tree Form
- Merits Of Binary Tree Form
- Binary Tree Properties & Representation
- Minimum Number Of Nodes
- Maximum Number Of Nodes
- Number Of Nodes & Height
- Full Binary Tree
- Numbering Nodes In A Full Binary Tree
- Node Number Properties
- Complete Binary Tree With n Nodes
- Complete Binary Tree Example
- Binary Tree Representation
- Array Representation (Binary Tree)
- Right-Skewed Binary Tree
- Linked Representation (Binary Tree)
- The Class BinaryTreeNode
- Linked Representation Example (Binary Tree)
- Binary Tree Traversal Methods
- Preorder Traversal
- Preorder Traversal Example
- Preorder Of Expression Tree
- Inorder Traversal
- Inorder Traversal Example
- Inorder By Projection (Squishing)
- Inorder Of Expression Tree
- Postorder Traversal
- Postorder Traversal Example
- Postorder Of Expression Tree
- Traversal Applications
- Level Order
- Level-Order Traversal Example
- Traversal Examples
- Preorder And Postorder
- Inorder And Preorder
- Inorder And Postorder
- Inorder And Level Order
- Priority Queues
- Min Priority Queue
- Max Priority Queue
- Complexity Of Priority Queue Operations
- Priority Queue Applications
- Priority Queue Sorting Example
- After Putting Into Max Priority Queue
- After First Remove Max Operation
- After Second Remove Max Operation
- After Third Remove Max Operation
- After Fourth Remove Max Operation
- After Fifth Remove Max Operation
- Complexity Of Heap Sorting
- Heap Sort
- Min Tree Definition
- Min Tree Example
- Max Tree Example
- Min Heap Definition
- Min Heap With 9 Nodes
- Max Heap With 9 Nodes
- Heap Height
- A Heap Is Efficiently Represented As An Array
- Moving Up And Down A Heap
- Putting An Element Into A Max Heap
- Complexity Of Heap Put Operation
- Removing The Max Element (Heap)
- Complexity Of Heap Remove Max Element
- Initializing A Max Heap
- Heap Time Complexity
- Heap Complexity
- Extended Binary Trees
- A Binary Tree (Extended Context)
- An Extended Binary Tree
- The Function s()
- s() Values Example
- Binary Search Trees
- Complexity Of BST Dictionary Operations
- Complexity Of Other BST Operations
- Definition Of Binary Search Tree
- Example Binary Search Tree
- The Operation ascend()
- The Operation get() (BST)
- The Operation put() (BST)
- The Operation remove() (BST)
- Remove From A Leaf (BST)
- Remove From A Degree 1 Node (BST)
- Remove From A Degree 2 Node (BST)
- Another Remove From A Degree 2 Node (BST)
- Indexed Binary Search Tree
- Example Indexed Binary Search Tree
- leftSize And Rank
- get(index) And remove(index) (Indexed BST)
- Linear List As Indexed Binary Tree
- add(5,’m’) (Indexed BST)
قیمت: 230/500 تومان
ساختمان داده و الگوریتم به شیوههای سازماندهی و ذخیرهسازی دادهها اطلاق میشود، که هر شیء داده (Data Object) را در قالب مناسب خود قرار میدهد. لیستهای خطی (مرتب) (Linear (or Ordered) Lists) یکی از سادهترین و پرکاربردترین ساختارها هستند.
مطالب مرتبط
- دانلود pdf ساختمان داده در 69 صفحه
مثالهایی از لیستهای خطی شامل مجموعهای از عناصر است که به ترتیب قرار گرفتهاند، و عملیات لیست خطی مانند دریافت (Get)، شاخص (IndexOf) و حذف (Remove) بر روی آنها انجام میشود.
مشخصات ساختار داده (Data Structure Specification) به تعریف ویژگیهای رفتار یک ساختار داده میپردازد، و نوع داده انتزاعی لیست خطی (Linear List Abstract Data Type) این عملیات را مستقل از پیادهسازی مشخص میکند. روشهای نمایش داده (Data Representation Methods) نیز چگونگی ذخیره فیزیکی این دادهها را نشان میدهند.
نمایش آرایهای لیست خطی (Linear List Array Representation) از جمله این روشها است که شامل نگاشت از راست به چپ (Right to Left Mapping)، نگاشت با رد کردن هر موقعیت دیگر و نگاشت گردشی (Wrap Around Mapping) میشود؛ نمایش استفاده شده در متن به صورت مفصل بررسی خواهد شد.
افزودن/حذف یک عنصر در لیست آرایهای (Array List) نیازمند مدیریت دقیق طول عنصر آرایه است، که ممکن است به بازسازی آرایه منجر شود. میتوان لیست خطی را به عنوان کلاس انتزاعی جاوا (Linear List As Java Abstract Class) تعریف کرد تا یک پایه مشترک برای پیادهسازیهای مختلف فراهم آورد.
نمایش پیوندی (کلی) (Linked Representation (General)) روش دیگری برای سازماندهی دادهها است که در آن عناصر به صورت فیزیکی پشت سر هم نیستند، بلکه از طریق اشارهگرها به یکدیگر متصل میشوند؛ طرح حافظه (Memory Layout) و روش معمول رسم لیست پیوندی (Normal Way To Draw A Linked List) چگونگی این اتصال را نشان میدهد.
در نمایش پیوندی، زنجیره (لیست پیوندی) (Chain (Linked List)) از گرههایی تشکیل شده است، و نمایش گره (زنجیره) (Node Representation (Chain)) شامل داده و اشارهگر به گره بعدی است. سازندههای گره زنجیره (Constructors Of ChainNode) برای ایجاد این گرهها به کار میروند.
عملیات دریافت (گره زنجیره) و عملیات افزودن (گره زنجیره) و حذف (گره زنجیره) نیازمند پیمایش زنجیره هستند، و باید به استثنای اشارهگر تهی (NullPointerException) در طول این عملیاتها توجه داشت.
کلاس زنجیره (The Class Chain) پیادهسازی کاملی از عملیات لیست پیوندی را ارائه میدهد که با سازندهها (کلاس زنجیره) آغاز میشود. متد خالی بودن (The Method isEmpty) و متد اندازه (The Method size()) وضعیت فعلی زنجیره را بازتاب میدهند.
متد بررسی شاخص (The Method checkIndex)، متد دریافت (The Method get) و متد شاخص (The Method indexOf) به دسترسی و مدیریت عناصر در زنجیره کمک میکنند. زنجیره با گره سرآیند (Chain With Header Node) و زنجیره خالی با گره سرآیند (Empty Chain With Header Node) نیز به بهبود عملکرد و سادگی کد کمک میکنند.
تغییرات پیشرفتهتری از لیستهای پیوندی شامل لیست دایرهای (Circular List) است که در آن آخرین گره به اولین گره اشاره میکند. لیست پیوندی دوگانه (Doubly Linked List) نیز امکان پیمایش در هر دو جهت را فراهم میآورد.
لیست دایرهای دوگانه پیوندی (Doubly Linked Circular List) ترکیبی از این دو ویژگی است و میتواند با گره سرآیند نیز همراه باشد (Doubly Linked Circular List With Header Node)؛ وجود لیست دایرهای دوگانه پیوندی خالی با گره سرآیند (Empty Doubly Linked Circular List With Header Node) حالات خاص را مدیریت میکند.
آرایهها (Arrays) یکی از اساسیترین ساختمان دادهها هستند که در نمایش آرایه تکبعدی در C و ++C به خوبی دیده میشوند. سربار فضایی (آرایهها) (Space Overhead (Arrays)) یکی از ملاحظات مهم در استفاده از آرایههاست.
آرایههای دوبعدی (2D Arrays) در ساختمان داده و الگوریتم برای نمایش دادههای جدولی استفاده میشوند، که از سطرها و ستونهای آرایه دوبعدی تشکیل شدهاند.
نمایش آرایه دوبعدی در C/C++ و Java/C/C++ نیازمند درک نگاشت ردیفمحور (Row-Major Mapping) و نگاشت ستونمحور (Column-Major Mapping) برای دسترسی به عناصر است. ماتریسهای پراکنده (Sparse Matrices) که بخش عمدهای از عناصرشان صفر هستند، نیاز به نمایش بهینه دارند.
نمایش ماتریسهای پراکنده غیرساختاریافته (Representation Of Unstructured Sparse Matrices) از روشهای خاصی برای صرفهجویی در فضا استفاده میکند که کارایی ساختمان داده و الگوریتم را در مواجهه با چنین دادههایی افزایش میدهد.
در برخی موارد، ممکن است یک مثال لیست خطی تکی (Single Linear List Example) به صورت نمایش لیست خطی آرایهای یا نمایش زنجیرهای (Chain Representation) پیادهسازی شود. در سناریوهای پیچیدهتر، زنجیره تکی (Single Chain) یا یک لیست خطی به ازای هر سطر (One Linear List Per Row) به همراه آرایهای از زنجیرههای سطر (Array Of Row Chains) به کار میروند.
نمایش لیست متعامد (Orthogonal List Representation) که شامل لیستهای سطر (Row Lists) و لیستهای ستون (Column Lists) است، برای دادههای با ارتباطات پیچیده و لیستهای متعامد (Orthogonal Lists) و تغییرات آنها مناسب است.
پشتهها (Stacks) یک نوع ساختمان داده خطی هستند که از قانون “آخرین ورود، اولین خروج” (LIFO) پیروی میکنند، مانند پشتهای از فنجانها (Stack Of Cups). رابط پشته (The Interface Stack) عملیاتهای اصلی آن را تعریف میکند.
تطبیق پرانتزها (Parentheses Matching) یکی از کاربردهای رایج پشته است که مثال تطبیق پرانتزها و راهحل بازگشتی برجهای هانوی/براهما (Towers Of Hanoi/Brahma) و برجهای هانوی نیز از این مفهوم بهره میبرند.
پشتهها میتوانند از کلاس لیست خطی، لیست خطی آرایهای (پشته) یا زنجیره (پشته) اشتقاق یابند. عملیات پشته شامل خالی بودن و مشاهده (empty() & peek()) است که به ترتیب بررسی میکند آیا پشته خالی است و عنصر بالایی را بدون حذف نمایش میدهد.
عملیات افزودن و حذف (push() & pop()) عناصر را به پشته اضافه یا از آن حذف میکنند. حذف سریعتر (A Faster pop())، پیادهسازی پشته: افزودن (Push) و پیادهسازی پشته: حذف (Pop) و پشته پیوندی از ابتدا (Linked Stack From Scratch) و کارایی پشته (Stack Performance) نکات مهمی در بهینهسازی هستند.
صفها (Queues) در ساختمان داده و الگوریتم نیز نوع دیگری از ساختمان دادههای خطی هستند که از قانون “اولین ورود، اولین خروج” (FIFO) پیروی میکنند، مانند صف توقف اتوبوس (Bus Stop Queue). رابط صف (The Interface Queue) عملیات اصلی آن را تعریف میکند.
صفها میتوانند از لیست خطی آرایهای (صف) یا زنجیره توسعهیافته (صف) اشتقاق یابند. یک صف آرایهای سفارشی (Custom Array Queue) شامل افزودن یک عنصر و حذف یک عنصر میشود که نیازمند مدیریت حرکت انتهای صف در جهت عقربههای ساعت (Moving rear Clockwise) است.
خالی کردن آن صف (Empty That Queue) و در نظر گرفتن حالتهای لبهای صف (Queue Edge Cases) از جمله سناریوهای حیاتی در پیادهسازی صفها است. عبارت “لطفاً باک را پر کنید” یک مثال استعاری از پر کردن صف را نشان میدهد.
درختها (Trees) ساختار دادههای غیرخطی هستند که دیدگاه دوستدار طبیعت از درخت با دیدگاه دانشمند کامپیوتر متفاوت است، اما هر دو به سلسلهمراتب اشاره دارند که لیستهای خطی و درختها از آن استفاده میکنند.
دادههای سلسلهمراتبی و درختها برای سازماندهی اطلاعاتی که دارای روابط والد-فرزند هستند، بسیار مناسبند. تعریف درخت (Tree Definition) و مثال کلاسهای درخت (Tree Classes Example) ساختار پایه را مشخص میکنند که شامل زیردرختها (Subtrees) و برگها (Leaves) میشود.
مفاهیم والد، پدربزرگ، خواهر و برادر، اجداد، نوادگان (Parent, Grandparent, Siblings, Ancestors, Descendants) به روابط بین گرهها اشاره دارند. سطحها (Levels)، ارتفاع، عمق و سطحهای درخت (Tree Height, Depth, and Levels) و درجه گره (Node Degree) و درجه درخت (Tree Degree) ویژگیهای مهم توپولوژی درخت هستند.
درخت دودویی (Binary Tree) در ساختمان داده و الگوریتم نوع خاصی از درخت است که هر گره حداکثر دو فرزند دارد، و تفاوتهای بین یک درخت و یک درخت دودویی مهم است. عبارات محاسباتی (Arithmetic Expressions) اغلب به صورت درختهای دودویی برای سادهسازی تجزیه و ارزیابی نمایش داده میشوند.