Skip to content

nutthanonn/data-structure-and-algorithms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Data Structures and Algorithms

Work Tree

Table of Contents

Data Structures

Algorithms





Stack

Stack 🥣

top

  • หลักการของ Stack ให้นึกถึงการวางจานซ้อนๆกันเป็นชั้นๆสังเกตุได้ว่าจานที่วางใบแรกจะเมื่อเรานำออกทีละใบ จานใบแรกที่วางจะออกเป็นลำดับสุดท้าย
  • Last in first out [LIFO]
    • push ➡️ push ลง stack
    • pop ➡️ pop ตัวสุดท้ายออกจาก stack

Queue

Queue 🚶 🚶 🚶

top

  • หลักการของ Queue ในนึกถึงการต่อคิวเข้าแถว คนี่เข้ามาถึงคนแรกก็จะได้ไปก่อนคนที่เข้ามาถึงคนสุดท้ายก็จะได้ไปคนสุดท้าย

  • First in first out [FIFO]

    • push ➡️ push ลง queue
    • pop ➡️ pop ตัวแรกออกจาก queue

Linkedlist

linkedlist 📕 👉 📗 👉 📙 👉 📓 👉 🕳️

top

  • หลักการของ linkedlist จะเป็นการเก็บข้อมูลเป็น node โดยที่ node แต่ละตัวก็จะเก็บ address ของตัวถัดไป

Example

type node struct {
    Val int
    Naxt *node
}

จะเห็นได้ชัดจากก้อน struct ตัวนี้ว่าจะเก็บ address ของ node ตัวถัดไปโดยในที่นี้เราตั้งชื่อว่า Next

Binary Tree

Binary Tree 🌳

top

  • หลักการของ Binary Tree หรือเรียกว่าต้นไม้ทวิภาค เป็นการเก็บข้อมูลแบบ Tree ประกอบด้วย

    • root ➡️ เป็นข้อมูลที่อยู่บนสุดของต้นไม้
    • leaf ➡️ เป็นข้อมูลที่อยู่ชั้นล่างสุดของต้นไม้
    • child ➡️ เป็นข้อมูลที่เป็นลูกๆของ node
    • parrent ➡️ เป็นข้อมูลก่อนหน้า node ปัจจุบัน
  • วิธีการสร้างคือ เราจะสร้าง root มาก่อนจากนั้นเมื่อเรา add node เข้าไป ถ้า val ของ node ตัวนั้นมีค่ามากกว่า root หรือ จะให้เพิ่มไปทางขวา แต่ถ้า node ตัวนั้นมีค่าน้อยกว่า root จะให้เพิ่มไปทางซ้าย

Example

type node struct {
    Val int
    Left *node
    Right *node
}

Tree Traversal

Tree Traversal 🌲 🌴 🌾

top

การเขียน In Pre Post เขียนเหมือนกันทุกประการ เปลี่ยนแค่บรรทัดที่ append node.value

Pre Order 👇

func PRE_ORDER_TRAVERSAL(n *Node){
    if n == nil {
        // return something
    }
    // append node value to array
    TRAVERSAL(n.Left)
    TRAVERSAL(n.Right)
}

In Order 👇

func IN_ORDER_TRAVERSAL(n *Node){
    if n == nil {
        // return something
    }
    TRAVERSAL(n.Left)
    // append node value to array
    TRAVERSAL(n.Right)
}

Post Order 👇

func POST_ORDER_TRAVERSAL(n *Node){
    if n == nil {
        // return something
    }
    TRAVERSAL(n.Left)
    TRAVERSAL(n.Right)
    // append node value to array
}
  • 👆 จาก Code ด้านบน จะเห็นได้ชัดเจนเลยว่า in pre post-order มีตำเเหน่งการ append to array ที่ตามชื่อเลย

Example

Heaps

heaps 🌸

top

  • parent คือ ตำแหน่งหลักของ Node โดย index จะห่างกันอยู่ที่ (index-1) / 2

  • left child คือ ตำแหน่งของ index ที่อยู่ทางด้านช้ายของ Heaps โดย index จะห่างกันอยู่ที่ (2 x index) + 1

  • right child ตำแหน่งของ index ที่อยู่ทางด้านขวาของ Heaps โดย index จะห่างกันอยู่ที่ (2 x index) + 2

  • heaps maxHeapiflyDown เป็นการ pop root node ออก จากนั้นหา node ที่มากที่สุดขึ้นมาเป็น root

  • maxHeapifly เป็น function ที่ไว้ตรวจดูว่า node ที่เราเพิ่งจะ insert เข้าไปนั้น มันมีค่ามากกว่า parent node ของมันหรือไม่ ถ้ามีค่ามากกว่าก็จะเรียกใช้ function swap

  • Extract เป็นการนำ root ของ Heaps ออกโดยจะนำ last index ของ array ขึ้นมาเป็น Root จากนั้นก็ทำการตรวจดูว่า child ตัวไหนมีค่ามากกว่าก็จะนำ node ตัวนั้นขึ้นมาเป็น root แทน

Example

Sorting

Sorting Algorithms 📃

top





Bubble Sort

Bubble Sort 🫧

top

  • Bubble sort เป็นการเรียงข้อมูลแบบสลับไปเรื่อยๆ โดยมี Algorithm คือ เมื่อตัวถัดไปมีค่าน้อยกว่าตัวปัจจุบัน ให้ทำการสลับตำแหน่ง และทำแบบนี้ไปเรื่อยๆจนกว่าจะหมด โดยอาศัยหลักการ Recursive function เข้ามาช่วย

Example

Insertion Sort

Insertion Sort ⛈️

top

  • Insertion sort เป็นการเรียงข้อมูลโดยใช้หลักการ เมื่อเจอตัวเลขที่มีค่าน้อยกว่าตัวก่อนหน้าให้นำตัวเลขนั้นไปอยู่ตำแหน่งที่มันควรจะอยู่ใน array ดังรูปภาพด้านล่าง

Example

Selection Sort

Selection Sort ⛰️

top

  • Selection Sort เป็นการเรียงข้อมูลที่เหมือนกับมนุษย์สุดๆ โดยจะมองหาตัวเลขที่น้อยที่สุดตามลำดับ การเติบโตขของฟังชั่น = O(n^2)

Example

Merge Sort

Merge Sort 🥇

top

  • Merge Sort เป็น Sorting Algorithm ที่เร็วที่สุด โดยมีอัตราการเติบโตของฟังชั่นเพียง O(nlogn) มีหลักการคือ แบ่ง Array เป็น 1/2 เรื่อยๆจนเหลือ ขนาด = 1 แล้วนำ Array ย่อยๆเเต่ละตัวมา Merge กัน โดยอาศัยหลักการทำงานแบบ divide and conquer คือ เเบ่งเพื่อชนะ
    • แบ่งปัญหาออกเป็นส่วนเล็กๆ
    • แก้ปัญหานั้นโดยเป็นอิสระต่อกัน
    • นำคำตอบที่ได้จากปัญหาย่อยๆมารวมกัน
  • Algorithmic Paradigm: Divide and Conquer

Example

Counting Sort

Counting Sort 🔄

top

  • Counting sort มีหลักการทำงาน คือ
    1. สังเกตุข้อมูลว่ามีข้อมูลที่ซ้ำกัน
    2. นับจำนวนข้อมูลที่ซ้ำกันว่ามีกี่ตัว
    3. นำข้อมูลที่ได้มาเรียง

Example

Quick Sort

Quick Sort ⚡

top

  • QuickSort มี 4 ขั้นตอน

    • 1 if len(arr) < 2 break
    • 2 เลือกตัวเลขขึ้นมาหนึ่งตัว เรียกเลขตัวนี้ว่า Pivot
    • 3 แบ่ง Array เป็น 2 ก้อน ก้อนแรกทุกตัวจะมีค่าน้อยกว่า Pivot ก้อนสองทุกตัวจะมีค่ามากกว่า Pivot
    • 4 กลับไปทำขั้นตอนแรกใหม่กับ Array1 และ Array2
  • Algorithmic Paradigm: Divide and Conquer

Example

Searching

Searching Algorithms 🔍 🔍 🔍

top





Binary Search

Binary Search Algorithm 🌱 🔍

top

  • Binary Search เป็น Algorithm ไว้ค้นหาข้อมูลสำหรับ Array ที่ถูก Sort ข้อมูลมาแล้ว
  1. หาค่า mid-index

  2. ถ้าค่า array[mid] > target ก็เปลี่ยนไปหาตั้งแต่ช่วง index mid ถึง len(array) - 1 ถ้าค่า array[mid] < target ก็เปลี่ยนไปหาช่วง index 0 ถึง mid-1

  3. ทำซำ้ 1-2 จนกว่า array[mid] = target ให้ return index mid

Example

Jump Search

Jump Search Algorithm 🔍 see_no_evil:

top

  • Jump Search เป็น Algorithm ไว้ค้นหาข้อมูลสำหรับ Array ที่ถูก Sort ข้อมูลมาแล้ว หลักการคือ เราจะทำการ search แบบกระโดด โดยจะกระโดดทีละ รากที่สองของ array size

Example

Linear Search

Linear Search 🔍 ➡️

top

  • Linear Search เป็น Searching Algorithm แบบง่ายที่สุด เพราะเปรียบเสมือนการมองไล่ดูเเต่ละตัวเลยว่าตรงกับ Target หรือไม่

Example

Dynamic Programming

Dynamic Programming 🖥️

top

  • Dynamic Programming เป็นเทคนิคหนึ่งสำหรับแก้ปัญหาที่ซับซ้อน โดยการแก้ปัญหาย่อย ตั้งแต่ปัญหาขนาดย่อยที่สุดขึ้นมาก่อน แล้วค่อย ๆ เพิ่มขอบเขตขึ้นมาจนถึงปัญหาที่มีขนาดใหญ่ที่สุด ส่วนมากมักจะประยุกต์ใช้กับ recursive function

Example





Graph and Tree

top





Depth First Search

Depth First Search Algorithm 🔍

  • Depth First search หรือเราเรียกกันว่า การค้นหาแบบลึกจะเป็นการใช้ stack เข้ามาช่วย การค้นหาแบบลึกคือเราจะค้นหาไปให้ได้ลึกที่สุดก่อนจากนั้นก็ค่อยออกมาค้นหาเส้นทางอื่น

Example

Breadth First Search

Breadth First Search Algorithm 🔍

top

  • Bepth First Search หรืออีกชื่อนึงคือ การค้นหาแบบกว้างจะใช้ Queue ในการช่วย การค้นหาแบบกว้างคือเราจะค้นหากว้างๆรอบๆให้หมดก่อนแล้วค่อยค้นหาลงไปในชั้นถัดๆไปของ graph

Example

Minimum Spanning Tree

Minimum Spanning Tree Algorithms 🌲

top





Kruskal's Algorithm

Kruskal's Algorithm 🌵

top

  • kruskal's algorithm เป็นตัวช่วยในการหาเส้นทางที่ส้นที่สุดที่เราจะสามารถไปได้ทุกจุดใน graph โดยหลักการคือ เราจะเลือกเส้นทางที่น้อยที่สุดในกราฟทั้งหมด แต่ต้องดูด้วยว่าการเลือกเส้นทางนั้นจะไม่ทำให้เกิด cycle

Example

Shortest Path

Shortest Path Alogorithms 🪴

top





Floyd Warshall Algorithm

Floyd Warshall Algorithm 🌱

top

  • FloyWarshall เป็น Algorithm ที่ทำให้ผมว้าวมากๆ เพราะสามารถหา shortest path ได้ทุกเส้นทางเลย แต่แลกมากับเวลาที่นานมากคือ o(n^3) Algorithm ตัวนี้ไม่ยาก เพียงแค่ใช้ Adjacency matrix

Example

Bellman Ford Algorithm

Bellman Ford single source shortest path Algorithm 🌿

top

  • Algorithm ของ BellmanFord เกิดขึ้นมาเพื่อแก้ไขปัญหา path ที่มีค่าติดลบ ที่ Dijkstra's Algorithm ไม่สามารถแก้ได้แต่ BellmanFord มีปัญหาตรงที่ ถ้าเกิด Cycle ใน graph แล้วผลรวม Weight ของ Cycle นั้น มีค่าติดลบ จะทำให้เกิดปัญหาขึ้น แต่ถ้าผลรวมเป็นบวกก็จะไม่มีปัญหา

หลักการ

1 ให้จุดเริ่มต้นเป็น 0 และทุกจุดมี distance เป็น Inf

2 จับ Egde มาเป็นคู่ๆ ถ้า distance ของตัวแรก + weight ของตัวถัดไป แล้วมีค่าน้อยกว่า distance ของตัวถัดไป ให้ distance ของตัวถัดไป เก็บค่า distance ของตัวก่อนหน้่า + weight

Example

//solution
.
.
.
if dist[u] != int(math.Inf(1)) && dist[u]+w <  dist[v] {
		dist[v] = dist[u] + w
}

3 ทำซ้ำข้อ 1-3 จนกว่าจะครบจำนวน Vertex - 1

Example

Array and Linkedlist

top





Inplace

inplace Algorithm 📚

top

  • Inplace Algo เป็นอัลกอที่ไว้ Reverse Array โดยใช้ for-loop คิดถึงแค่ n ÷ 2 ของ size of array

Min-Max

Tournament Method Algorithm in Golang 🔖

top

  • ตัวนี้เป็น Algorithms ในการหา max-min โดยที่ใช้ divide and conquer

  • Algorithmic Paradigm: Divide and Conquer

Kadane's Algorithm

Kadane's Algorithm 📑

top

  • ไว้หา sub array ที่มีผลรวมมากที่สุด

Floyd’s Cycle Detection Algorithm

Floyd’s Cycle Detection Algorithm 🌀

top

  • Aloorithm นี้ไว้หา loop ของ linkedlist โดยจะให้ q ถัดไปทีละ 1 node แต่ p จะถัดไปทีละ 2 node และใน Cycle ถ้า p == q มันก็จะรู้ได้ทันทีเลยว่า linkedlist นี้มี Cycle

Number

Number Alogorithms 🔢

top





karatsuba Algorithm

karatsuba Algorithm in golang *️⃣

top

  • เป็น Algorithm ที่ไว้ใช้ในการคูณเลขจำนวนมากๆ
  • Algorithmic Paradigm: Divide and Conquer

Example