โครงสร้างข้อมูลและอัลกอริทึม
โครงสร้างข้อมูลและอัลกอริทึม (DSA) เป็นหนึ่งในหัวข้อที่สำคัญที่สุดในวิทยาศาสตร์คอมพิวเตอร์ที่นักเรียน CS ทุกคนจะต้องมีความเชี่ยวชาญในและแม้แต่นักเรียนที่ไม่ใช่ CS จะต้องมีความเข้าใจพื้นฐาน ว่ากันว่า DSA เป็นเหมือนขนมปังและเนยความจำเป็นของ CS ที่เก็บนี้ทำขึ้นสำหรับนักเรียนเหล่านั้น (เช่นฉัน?) ใครกระตือรือร้นที่จะเรียนรู้และต้องการใช้โครงสร้างข้อมูลและอัลกอริทึม
ทำไมต้องไป/โกลันและไม่ใช่ C, C ++ หรือ Java?
ฉันไม่เห็นด้วยที่ C, C ++ หรือ Java จะไม่เป็นภาษาที่ยอดเยี่ยมในการใช้ DSA เพราะต้องดูแลสิ่งต่าง ๆ มากมายในขณะที่เขียนรหัสเช่นการจัดสรรหน่วยความจำและการจัดเรียงที่เหมาะสม
อย่างไรก็ตามเหตุผลที่ว่าทำไมไปก็เป็นภาษาที่ดีในการใช้ DSA ก็คือมันขาดเวทมนตร์มากมาย ไม่มีผู้ให้บริการมากเกินไปดังนั้นจึงไม่มีวิธีซ่อนความซับซ้อนเป็นพิเศษ การดำเนินการดัชนีคือ o (1), ลูปคือ o (n) - เสมอ ไม่มียาสามัญดังนั้นสิ่งที่เป็นนามธรรมและผู้ช่วยเหลือจำนวนมากจึงไม่มีอยู่จริงซึ่งจริง ๆ แล้วค่อนข้างดี ไม่มีความเกียจคร้านหรือเวทมนตร์ที่ขับเคลื่อนด้วยคอมไพเลอร์อื่น ๆ ที่อาจเปลี่ยนรันไทม์ของอัลกอริทึมของคุณอย่างมีนัยสำคัญ และ GO มีตัวชี้และดั้งเดิมระดับต่ำสำหรับชิ้นซึ่งหมายความว่ามันจะเห็นได้ชัดเมื่อข้อมูลถูกบรรจุหรือเมื่อข้อมูลมีการอ้อมเป็นพิเศษ กล่าวโดยย่อ : ไปทำให้การดำเนินการอัลกอริทึมที่แท้จริงเห็นได้ชัดจากรหัสซึ่งเป็นสิ่งที่ดีในการเรียนรู้อัลกอริทึม
สรุป : GO จะเป็นภาษาที่ดีในการเริ่มต้นกับการใช้โครงสร้างข้อมูลและอัลกอริทึม
คำแนะนำ
- ในการเริ่มต้นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งภาษาการเขียนโปรแกรมบนคอมพิวเตอร์ของคุณแล้ว ทำตามวิธีการติดตั้งคำแนะนำจากคำแนะนำดาวน์โหลด Golang
- เมื่อไปติดตั้งบนเครื่องของคุณเพียงแค่โคลนหรือดาวน์โหลดที่เก็บนี้
- ตอนนี้
cd <folder-name> ลงในโฟลเดอร์ที่ไฟล์ที่คุณต้องการเรียกใช้อยู่ - ตอนนี้วิ่ง
go run . -
ตัวอย่าง
สมมติว่าคุณต้องการเรียกใช้ไฟล์ที่อยู่ใน graphs/directed_unweighted จากนั้นไวยากรณ์ในการรันมันจะเป็น:
cd graphs/directed_unweighted/
go run .
ชื่อโฟลเดอร์
- อัลกอริทึม -
- 01KNAPSACK_DP - 0-1 ปัญหา KNAPSACK โดยใช้การเขียนโปรแกรมแบบไดนามิก
- a_star -
- 8_Puzzle - 8 ปัญหาปริศนาโดยใช้อัลกอริทึม *
- directed_graph - อัลกอริทึม * สำหรับกราฟกำกับโดยตรง
- undirected_graph - อัลกอริทึม * สำหรับกราฟที่ไม่ได้กำกับ
- Activity_selection_gp - การเลือกกิจกรรมโดยใช้การเขียนโปรแกรมโลภ
- ASSEMBLY_LINE_SCHEDULING - อัลกอริธึมการตั้งเวลาของแอสเซมบลีโดยใช้การเขียนโปรแกรมแบบไดนามิก
- binary_reflected_gray_codes - รหัสสีเทาที่สะท้อนไบนารี
- ใกล้เคียงที่สุด _pair_problem -
- CPP_BRUTE_FORCE - ปัญหาคู่ที่ใกล้เคียงที่สุดโดยใช้เทคนิคการใช้กำลังเดรัจฉาน
- CPP_DIVIDE_CONQURE - ปัญหาคู่ที่ใกล้ที่สุดโดยใช้ Divide and Conquer Techinque
- ชุดค่าผสม -
- with_r - ด้วยการทำซ้ำขององค์ประกอบ
- ไม่มี _R - ไม่มีองค์ประกอบซ้ำ ๆ
- convex_hull -
- ch_brute_force - อัลกอริทึมฮัลล์นูนโดยใช้เทคนิคการใช้กำลังเดรัจฉาน
- CH_DIVIDE_CONQURE - อัลกอริทึม HULL CONVEX โดยใช้เทคนิคการหารและพิชิต
- Expression_conversions -
- infix_postfix - Infix to Postfix Conversion
- infix_prefix - infix เป็นการแปลงคำนำหน้า
- postfix_infix - postfix เป็น Infix Conversion
- postfix_prefix - postfix เป็นคำนำหน้าการแปลง
- Prefix_infix - คำนำหน้าเป็น Infix Conversion
- prefix_postfix - คำนำหน้าเป็นการแปลง postfix
- GCD - ตัวหารสามัญที่ยิ่งใหญ่ที่สุด (อัลกอริทึมของ Euclid)
- กราฟ -
- ข้อ ต่อ _point_detection - การตรวจจับจุดที่เปล่งออกมาในกราฟที่ไม่ได้กำกับ
- Bellman_ford - อัลกอริทึม Bellman Ford
- bridge_detection - การตรวจจับสะพาน/การตรวจจับขอบตัดในกราฟที่ไม่ได้บอกทิศทาง
- Dijkstra - อัลกอริทึมของ Dijkstra
- FLOYD_WARSHALL - อัลกอริทึม Floyd Warshall (ทุกจุดที่สั้นที่สุด)
- KRUSKALS - อัลกอริทึมของ Kruskal (ค้นหา MST ต้นไม้ที่ทอดขั้นต่ำโดยใช้วิธีโลภ)
- Prims - อัลกอริทึมของ Prim (ค้นหาต้นไม้ MST ขั้นต่ำสุดโดยใช้วิธีโลภ)
- ทอพอโลยี _sort - การจัดเรียงทอพอโลยี
- Traversals -
- cd_directed_graph_traversals - การตรวจจับรอบในกราฟกำกับโดยตรงโดยใช้เทคนิคการสำรวจ
- cd_undirected_graph_traversals - การตรวจจับรอบในกราฟที่ไม่ได้ทิศทางโดยใช้เทคนิคการสำรวจ
- TSP -
- tsp_dynamic -
- directed_graph - TSP (ปัญหาพนักงานขายเดินทาง) โดยใช้วิธีการแบบไดนามิกสำหรับกราฟกำกับโดยตรง
- undirected_graph - TSP (ปัญหาพนักงานขายเดินทาง) โดยใช้วิธีการแบบไดนามิกสำหรับกราฟที่ไม่ได้บอกทิศทาง
- tsp_naive -
- directed_graph - TSP (ปัญหาพนักงานขายเดินทาง) โดยใช้วิธีที่ไร้เดียงสาสำหรับกราฟกำกับโดยตรง
- undirected_graph - TSP (ปัญหาพนักงานขายเดินทาง) โดยใช้วิธีที่ไร้เดียงสาสำหรับกราฟที่ไม่ได้บอกทิศทาง
- Union_find - ชุดพบ / ชุดแยก (ตรวจจับรอบในกราฟที่ไม่ได้บอกทิศทาง)
- huffman_codes - รหัส Huffman (สร้างรหัส Huffman)
- job_scheduling_gp - อัลกอริทึมการจัดตารางงานโดยใช้การเขียนโปรแกรมโลภ
- LCM - น้อยที่สุดหลายตัว (ใช้อัลกอริทึมของ GCD Euclid)
- LCS - ลำดับที่ยาวที่สุดทั่วไป
- iterative_dp - ต่อมาที่ยาวที่สุดโดยใช้การเขียนโปรแกรมแบบไดนามิก (เวอร์ชันวนซ้ำ)
- lo_permutations - การเรียงลำดับการสั่งซื้อพจนานุกรม
- longest_palindrome_substring -
- Brute_Force - สายย่อย Palindrome ที่ยาวที่สุดโดยใช้เทคนิคการใช้กำลังเดรัจฉาน
- Manchers - สายย่อย Palindrome ที่ยาวที่สุดโดยใช้อัลกอริทึมของ Mancher
- Making_change_dp - ทำให้เกิดปัญหาการเปลี่ยนแปลงโดยใช้การเขียนโปรแกรมแบบไดนามิก
- Order_statistics - การค้นหาองค์ประกอบที่เล็กที่สุด/ใหญ่ที่สุด (สถิติการสั่งซื้อ)
- Naive_approach - วิธีที่ไร้เดียงสาโดยใช้ Max Heap - O (K + (NK)*log (k))
- Quick_select - เลือกอย่างรวดเร็ว (เรียงลำดับอย่างรวดเร็ว) - o (n^2), θ (nlogn)
- WORST_CASE_LINEAR_TIME - กรณีเวลาการสั่งซื้อเวลาเชิงเส้นที่เลวร้ายที่สุด - O (N)
- Power_set - ชุดพลังงาน (ชุดย่อย)
- ค้นหา -
- binary_search - การค้นหาแบบไบนารี - O (log n)
- การแก้ไข _Search - การค้นหาการแก้ไข - O (n)
- linear_search - การค้นหาเชิงเส้น - o (n)
- ternary_search - การค้นหาแบบ ternary - O (บันทึก 3 N)
- Sieve_of_eratosthenes - ตะแกรงของ Eratosthenes (ช่วงเวลาติดต่อกันไม่เกิน n)
- การเรียงลำดับ -
- binary_insertion_sort - การเรียงลำดับไบนารีเรียงลำดับ - O (n 2 )
- Bubble_sort - Bubble Sort - O (n 2 )
- Bucket_sort - Bucket Sort - O (n 2 )
- Counting_sort - การเรียงลำดับ - O (n + k)
- HEAP_SORT - HEAP SORT - O (NLOG (N)
- Insertion_sort - การเรียงลำดับ - O (n 2 )
- Merge_sort - Merge Sort - O (nlog (n))
- Quick_sort - การเรียงลำดับอย่างรวดเร็ว - θ (nlog (n))
- Radix_sort - Radix Sort - O (N+K)
- selection_sort - การเลือกการเลือก - (o (n 2 ))
- Shell_sort - Shell sort - о (n)
- String_matching -
- Boyer_moore - อัลกอริทึม Boyer Moore
- Horspool - อัลกอริทึม Horspool Boyer Moore
- knuth_morris_pratt - Knuth Morris Pratt
- naive_pattern_matching - การจับคู่รูปแบบไร้เดียงสา
- rabin_karp - Rabin Karp
- Toh - หอคอยแห่งฮานอย
- กราฟ -
- directed_unweighted - กราฟที่ไม่ถ่วงน้ำหนักกำกับ
- directed_weighted - กราฟถ่วงน้ำหนักโดยตรง
- undirected_unweighted - กราฟที่ไม่ได้ทำ
- undirected_weighted - กราฟถ่วงน้ำหนักที่ไม่ได้บอกทิศทาง
- กอง -
- max_binary_heap - Max Binary Heap
- min_binary_heap - Min Binary Heap
- linked_lists -
- circular_doubly_ll - รายการที่เชื่อมโยงสองเท่าแบบวงกลม
- circular_ll - รายการที่เชื่อมโยงวงกลม
- Doubly_ll - รายการที่เชื่อมโยงเป็นสองเท่า
- PRES_REV_SINGLE_LL - รักษาคำสั่งซื้อระหว่างการแทรกในรายการที่เชื่อมโยงเดียวและการย้อนกลับรายการลิงค์เดียว
- single_ll - รายการลิงค์เดียว
- คิว -
- CDQUEUE - คิวปลายคู่แบบวงกลม
- cqueue - คิววงกลม
- dqueue - คิวจบสองครั้ง
- Priority_queue - คิวลำดับความสำคัญกับการใช้ Min Heeap
- simple_queue - คิวง่ายๆ
- สแต็ค - สแต็ค
- ต้นไม้ -
- AVL_TREE_USING_LL - ต้นไม้ AVL โดยใช้รายการที่เชื่อมโยงกับ BFS และ DFS (pre, in, โพสต์) สั่งการเดินทาง
- BST_USING_ARR - แผนผังค้นหาไบนารีโดยใช้อาร์เรย์ด้วย BFS และ DFS (ก่อน, ใน, โพสต์) สั่งการเดินทาง
- BST_USING_LL - แผนผังการค้นหาไบนารีโดยใช้รายการที่เชื่อมโยงกับ BFS และ DFS (ก่อน, ใน, โพสต์) สั่งการเดินทาง
- simple_bt_using_arr - ทรีไบนารีง่าย ๆ โดยใช้อาร์เรย์กับ BFS และ DFS (ก่อน, ใน, โพสต์) สั่งการเดินทาง
- simple_bt_using_ll - ทรีไบนารีง่าย ๆ โดยใช้รายการที่เชื่อมโยงกับ BFS และ DFS (pre, in, โพสต์) สั่งการเดินทาง
หมายเหตุ : ตัวชี้ ": point_left:" หมายถึงการใช้งานที่ไม่สมบูรณ์และอยู่ในรายการสิ่งที่ต้องทำ
ผลงาน
ที่เก็บนี้มีไว้สำหรับการเรียนรู้วิธีการใช้โครงสร้างข้อมูลและอัลกอริทึมและเนื่องจากการมีส่วนร่วมของผู้อื่นจะไม่สอนฉันถึงวิธีการใช้งานด้วยตัวเองฉันจะไม่ยอมรับคำขอดึงใด ๆ อย่างไรก็ตามอย่าลังเลที่จะแยก repo นี้และแก้ไขรหัสเพื่อเล่นรอบ ๆ โครงสร้างข้อมูลและอัลกอริทึมต่างๆ ยิ่งกว่านั้นในขณะที่เล่นกับรหัสหากคุณพบสิ่งที่ผิดปกติหรือผิดในการ impleMetation ฉันจะขอบคุณอย่างมากถ้าคุณสร้างปัญหาในสิ่งเดียวกัน
ใบอนุญาต
ที่เก็บนี้จะถูกปล่อยภายใต้ใบอนุญาต MIT กล่าวโดยย่อนั่นหมายความว่าคุณมีอิสระที่จะใช้ซอฟต์แวร์นี้ในโครงการส่วนตัวโอเพนซอร์ซหรือโครงการเชิงพาณิชย์ การระบุแหล่งที่มาเป็นทางเลือก แต่ชื่นชม
HAPPY CODING
HAPPY LEARNING