From 19dde675df58ee2f90cb6c6c07589a3be9b47040 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Wed, 27 Dec 2023 00:42:55 +0800 Subject: [PATCH] translation: Add the initial translation of the array and linked list chapter (#1008) * Add the translation of the data structure chapter. Synchronize the headings in mkdocs-en.yml * Fix a typo * Add the translation of the array and linked-list chapter --- .../array.assets/array_definition.png | Bin 0 -> 21103 bytes .../array.assets/array_insert_element.png | Bin 0 -> 29326 bytes .../array_memory_location_calculation.png | Bin 0 -> 24268 bytes .../array.assets/array_remove_element.png | Bin 0 -> 27642 bytes docs-en/chapter_array_and_linkedlist/array.md | 210 +++++ docs-en/chapter_array_and_linkedlist/index.md | 9 + .../linkedlist_common_types.png | Bin 0 -> 19941 bytes .../linkedlist_definition.png | Bin 0 -> 26266 bytes .../linkedlist_insert_node.png | Bin 0 -> 21993 bytes .../linkedlist_remove_node.png | Bin 0 -> 24346 bytes .../linked_list.md | 668 ++++++++++++++ docs-en/chapter_array_and_linkedlist/list.md | 870 ++++++++++++++++++ .../computer_storage_devices.png | Bin 0 -> 12981 bytes .../ram_and_cache.assets/storage_pyramid.png | Bin 0 -> 19272 bytes .../ram_and_cache.md | 71 ++ .../chapter_array_and_linkedlist/summary.md | 81 ++ .../basic_data_types.md | 24 +- 17 files changed, 1921 insertions(+), 12 deletions(-) create mode 100644 docs-en/chapter_array_and_linkedlist/array.assets/array_definition.png create mode 100644 docs-en/chapter_array_and_linkedlist/array.assets/array_insert_element.png create mode 100644 docs-en/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png create mode 100644 docs-en/chapter_array_and_linkedlist/array.assets/array_remove_element.png create mode 100755 docs-en/chapter_array_and_linkedlist/array.md create mode 100644 docs-en/chapter_array_and_linkedlist/index.md create mode 100644 docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png create mode 100644 docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_definition.png create mode 100644 docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png create mode 100644 docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png create mode 100755 docs-en/chapter_array_and_linkedlist/linked_list.md create mode 100755 docs-en/chapter_array_and_linkedlist/list.md create mode 100644 docs-en/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png create mode 100644 docs-en/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png create mode 100644 docs-en/chapter_array_and_linkedlist/ram_and_cache.md create mode 100644 docs-en/chapter_array_and_linkedlist/summary.md diff --git a/docs-en/chapter_array_and_linkedlist/array.assets/array_definition.png b/docs-en/chapter_array_and_linkedlist/array.assets/array_definition.png new file mode 100644 index 0000000000000000000000000000000000000000..ca996b71fe5218cc5532e815397633c30fdcdb24 GIT binary patch literal 21103 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 C2kHd? literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/array.assets/array_insert_element.png b/docs-en/chapter_array_and_linkedlist/array.assets/array_insert_element.png new file mode 100644 index 0000000000000000000000000000000000000000..e7887341e0e47099cab5082aea66a3097a1bf234 GIT binary patch literal 29326 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 literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png b/docs-en/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png new file mode 100644 index 0000000000000000000000000000000000000000..8143a9343d7cdf3f0a2027a3da81af9e87c0ecbf GIT binary patch literal 24268 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 literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/array.assets/array_remove_element.png b/docs-en/chapter_array_and_linkedlist/array.assets/array_remove_element.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbadb533d941c7f8ce6b776aedfacd8f892fbbf GIT binary patch literal 27642 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 literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/array.md b/docs-en/chapter_array_and_linkedlist/array.md new file mode 100755 index 00000000..c085b904 --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/array.md @@ -0,0 +1,210 @@ +# Arrays + +The "array" is a linear data structure that stores elements of the same type in contiguous memory locations. We refer to the position of an element in the array as its "index". The following image illustrates the main terminology and concepts of an array. + +![Array Definition and Storage Method](array.assets/array_definition.png) + +## Common Operations on Arrays + +### Initializing Arrays + +There are two ways to initialize arrays depending on the requirements: without initial values and with given initial values. In cases where initial values are not specified, most programming languages will initialize the array elements to $0$: + +=== "Python" + + ```python title="array.py" + # Initialize array + arr: list[int] = [0] * 5 # [ 0, 0, 0, 0, 0 ] + nums: list[int] = [1, 3, 2, 5, 4] + ``` + +=== "C++" + + ```cpp title="array.cpp" + /* Initialize array */ + // Stored on stack + int arr[5]; + int nums[5] = { 1, 3, 2, 5, 4 }; + // Stored on heap (manual memory release needed) + int* arr1 = new int[5]; + int* nums1 = new int[5] { 1, 3, 2, 5, 4 }; + ``` + +=== "Java" + + ```java title="array.java" + /* Initialize array */ + int[] arr = new int[5]; // { 0, 0, 0, 0, 0 } + int[] nums = { 1, 3, 2, 5, 4 }; + ``` + +=== "C#" + + ```csharp title="array.cs" + /* Initialize array */ + int[] arr = new int[5]; // { 0, 0, 0, 0, 0 } + int[] nums = [1, 3, 2, 5, 4]; + ``` + +=== "Go" + + ```go title="array.go" + /* Initialize array */ + var arr [5]int + // In Go, specifying the length ([5]int) denotes an array, while not specifying it ([]int) denotes a slice. + // Since Go's arrays are designed to have compile-time fixed length, only constants can be used to specify the length. + // For convenience in implementing the extend() method, the Slice will be considered as an Array here. + nums := []int{1, 3, 2, 5, 4} + ``` + +=== "Swift" + + ```swift title="array.swift" + /* Initialize array */ + let arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0] + let nums = [1, 3, 2, 5, 4] + ``` + +=== "JS" + + ```javascript title="array.js" + /* Initialize array */ + var arr = new Array(5).fill(0); + var nums = [1, 3, 2, 5, 4]; + ``` + +=== "TS" + + ```typescript title="array.ts" + /* Initialize array */ + let arr: number[] = new Array(5).fill(0); + let nums: number[] = [1, 3, 2, 5, 4]; + ``` + +=== "Dart" + + ```dart title="array.dart" + /* Initialize array */ + List arr = List.filled(5, 0); // [0, 0, 0, 0, 0] + List nums = [1, 3, 2, 5, 4]; + ``` + +=== "Rust" + + ```rust title="array.rs" + /* Initialize array */ + let arr: Vec = vec![0; 5]; // [0, 0, 0, 0, 0] + let nums: Vec = vec![1, 3, 2, 5, 4]; + ``` + +=== "C" + + ```c title="array.c" + /* Initialize array */ + int arr[5] = { 0 }; // { 0, 0, 0, 0, 0 } + int nums[5] = { 1, 3, 2, 5, 4 }; + ``` + +=== "Zig" + + ```zig title="array.zig" + // Initialize array + var arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 } + var nums = [_]i32{ 1, 3, 2, 5, 4 }; + ``` + +### Accessing Elements + +Elements in an array are stored in contiguous memory locations, which makes it easy to compute the memory address of any element. Given the memory address of the array (the address of the first element) and the index of an element, we can calculate the memory address of that element using the formula shown in the following image, allowing direct access to the element. + +![Memory Address Calculation for Array Elements](array.assets/array_memory_location_calculation.png) + +As observed in the above image, the index of the first element of an array is $0$, which may seem counterintuitive since counting starts from $1$. However, from the perspective of the address calculation formula, **an index is essentially an offset from the memory address**. The offset for the first element's address is $0$, making its index $0$ logical. + +Accessing elements in an array is highly efficient, allowing us to randomly access any element in $O(1)$ time. + +```src +[file]{array}-[class]{}-[func]{random_access} +``` + +### Inserting Elements + +As shown in the image below, to insert an element in the middle of an array, all elements following the insertion point must be moved one position back to make room for the new element. + +![Array Element Insertion Example](array.assets/array_insert_element.png) + +It's important to note that since the length of an array is fixed, inserting an element will inevitably lead to the loss of the last element in the array. We will discuss solutions to this problem in the "List" chapter. + +```src +[file]{array}-[class]{}-[func]{insert} +``` + +### Deleting Elements + +Similarly, as illustrated below, to delete an element at index $i$, all elements following index $i$ must be moved forward by one position. + +![Array Element Deletion Example](array.assets/array_remove_element.png) + +Note that after deletion, the last element becomes "meaningless", so we do not need to specifically modify it. + +```src +[file]{array}-[class]{}-[func]{remove} +``` + +Overall, the insertion and deletion operations in arrays have the following disadvantages: + +- **High Time Complexity**: Both insertion and deletion in an array have an average time complexity of $O(n)$, where $n$ is the length of the array. +- **Loss of Elements**: Due to the fixed length of arrays, elements that exceed the array's capacity are lost during insertion. +- **Waste of Memory**: We can initialize a longer array and use only the front part, allowing the "lost" end elements during insertion to be "meaningless", but this leads to some wasted memory space. + +### Traversing Arrays + +In most programming languages, we can traverse an array either by indices or by directly iterating over each element: + +```src +[file]{array}-[class]{}-[func]{traverse} +``` + +### Finding Elements + +To find a specific element in an array, we need to iterate through it, checking each element to see if it matches. + +Since arrays are linear data structures, this operation is known as "linear search". + +```src +[file]{array}-[class]{}-[func]{find} +``` + +### Expanding Arrays + +In complex system environments, it's challenging to ensure that the memory space following an array is available, making it unsafe to extend the array's capacity. Therefore, in most programming languages, **the length of an array is immutable**. + +To expand an array, we need to create a larger array and then copy the elements from the original array. This operation has a time complexity of $O(n)$ and can be time-consuming for large arrays. The code is as follows: + +```src +[file]{array}-[class]{}-[func]{extend} +``` + +## Advantages and Limitations of Arrays + +Arrays are stored in contiguous memory spaces and consist of elements of the same type. This approach includes a wealth of prior information that the system can use to optimize the operation efficiency of the data structure. + +- **High Space Efficiency**: Arrays allocate a contiguous block of memory for data, eliminating the need for additional structural overhead. +- **Support for Random Access**: Arrays allow $O(1)$ time access to any element. +- **Cache Locality**: When accessing array elements, the computer not only loads them but also caches the surrounding data, leveraging high-speed cache to improve the speed of subsequent operations. + +However, continuous space storage is a double-edged sword, with the following limitations: + +- **Low Efficiency in Insertion and Deletion**: When there are many elements in an array, insertion and deletion operations require moving a large number of elements. +- **Fixed Length**: The length of an array is fixed after initialization. Expanding an array requires copying all data to a new array, which is costly. +- **Space Wastage**: If the allocated size of an array exceeds the actual need, the extra space is wasted. + +## Typical Applications of Arrays + +Arrays are a fundamental and common data structure, frequently used in various algorithms and in implementing complex data structures. + +- **Random Access**: If we want to randomly sample some data, we can use an array for storage and generate a random sequence to implement random sampling based on indices. +- **Sorting and Searching**: Arrays are the most commonly used data structure for sorting and searching algorithms. Quick sort, merge sort, binary search, etc., are primarily conducted on arrays. +- **Lookup Tables**: Arrays can be used as lookup tables for fast element or relationship retrieval. For instance, if we want to implement a mapping from characters to ASCII codes, we can use the ASCII code value of a character as the index, with the corresponding element stored in the corresponding position in the array. +- **Machine Learning**: Arrays are extensively used in neural networks for linear algebra operations between vectors, matrices, and tensors. Arrays are the most commonly used data structure in neural network programming. +- **Data Structure Implementation**: Arrays can be used to implement stacks, queues, hash tables, heaps, graphs, etc. For example, the adjacency matrix representation of a graph is essentially a two-dimensional array. diff --git a/docs-en/chapter_array_and_linkedlist/index.md b/docs-en/chapter_array_and_linkedlist/index.md new file mode 100644 index 00000000..838aebe0 --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/index.md @@ -0,0 +1,9 @@ +# Arrays and Linked Lists + +![Arrays and Linked Lists](../assets/covers/chapter_array_and_linkedlist.jpg) + +!!! abstract + + The world of data structures is like a solid brick wall. + + The bricks of an array are neatly arranged, each closely connected to the next. In contrast, the bricks of a linked list are scattered, with vines of connections freely weaving through the gaps between bricks. diff --git a/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png b/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png new file mode 100644 index 0000000000000000000000000000000000000000..7df8d1e96226448717a09700997c361b1fc9a165 GIT binary patch literal 19941 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 literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png b/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png new file mode 100644 index 0000000000000000000000000000000000000000..e515c1fbba75973d45daf9bd94ed589dcd614307 GIT binary patch literal 21993 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 literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png b/docs-en/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png new file mode 100644 index 0000000000000000000000000000000000000000..25a9b458ba5ee659a8d08d6021dcc8f6e40d55d2 GIT binary patch literal 24346 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

*H~QFeIldM_?~6Uqd+oo9 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 F{eO}}(pvxk literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/linked_list.md b/docs-en/chapter_array_and_linkedlist/linked_list.md new file mode 100755 index 00000000..6f4435b4 --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/linked_list.md @@ -0,0 +1,668 @@ +# Linked Lists + +Memory space is a common resource for all programs. In a complex system environment, free memory space can be scattered throughout memory. We know that the memory space for storing an array must be contiguous, and when the array is very large, it may not be possible to provide such a large contiguous space. This is where the flexibility advantage of linked lists becomes apparent. + +A "linked list" is a linear data structure where each element is a node object, and the nodes are connected via "references". A reference records the memory address of the next node, allowing access to the next node from the current one. + +The design of a linked list allows its nodes to be scattered throughout memory, with no need for contiguous memory addresses. + +![Linked List Definition and Storage Method](linked_list.assets/linkedlist_definition.png) + +Observing the image above, the fundamental unit of a linked list is the "node" object. Each node contains two pieces of data: the "value" of the node and the "reference" to the next node. + +- The first node of a linked list is known as the "head node", and the last one is called the "tail node". +- The tail node points to "null", which is represented as $\text{null}$ in Java, $\text{nullptr}$ in C++, and $\text{None}$ in Python. +- In languages that support pointers, like C, C++, Go, and Rust, the aforementioned "reference" should be replaced with a "pointer". + +As shown in the following code, a linked list node `ListNode`, apart from containing a value, also needs to store a reference (pointer). Therefore, **a linked list consumes more memory space than an array for the same amount of data**. + +=== "Python" + + ```python title="" + class ListNode: + """Linked List Node Class""" + def __init__(self, val: int): + self.val: int = val # Node value + self.next: ListNode | None = None # Reference to the next node + ``` + +=== "C++" + + ```cpp title="" + /* Linked List Node Structure */ + struct ListNode { + int val; // Node value + ListNode *next; // Pointer to the next node + ListNode(int x) : val(x), next(nullptr) {} // Constructor + }; + ``` + +=== "Java" + + ```java title="" + /* Linked List Node Class */ + class ListNode { + int val; // Node value + ListNode next; // Reference to the next node + ListNode(int x) { val = x; } // Constructor + } + ``` + +=== "C#" + + ```csharp title="" + /* Linked List Node Class */ + class ListNode(int x) { // Constructor + int val = x; // Node value + ListNode? next; // Reference to the next node + } + ``` + +=== "Go" + + ```go title="" + /* Linked List Node Structure */ + type ListNode struct { + Val int // Node value + Next *ListNode // Pointer to the next node + } + + // NewListNode Constructor, creates a new linked list + func NewListNode(val int) *ListNode { + return &ListNode{ + Val: val, + Next: nil, + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Linked List Node Class */ + class ListNode { + var val: Int // Node value + var next: ListNode? // Reference to the next node + + init(x: Int) { // Constructor + val = x + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Linked List Node Class */ + class ListNode { + constructor(val, next) { + this.val = (val === undefined ? 0 : val); // Node value + this.next = (next === undefined ? null : next); // Reference to the next node + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Linked List Node Class */ + class ListNode { + val: number; + next: ListNode | null; + constructor(val?: number, next?: ListNode | null) { + this.val = val === undefined ? 0 : val; // Node value + this.next = next === undefined ? null : next; // Reference to the next node + } + } + ``` + +=== "Dart" + + ```dart title="" + /* 链表节点类 */ + class ListNode { + int val; // Node value + ListNode? next; // Reference to the next node + ListNode(this.val, [this.next]); // Constructor + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + /* Linked List Node Class */ + #[derive(Debug)] + struct ListNode { + val: i32, // Node value + next: Option>>, // Pointer to the next node + } + ``` + +=== "C" + + ```c title="" + /* Linked List Node Structure */ + typedef struct ListNode { + int val; // Node value + struct ListNode *next; // Pointer to the next node + } ListNode; + + /* Constructor */ + ListNode *newListNode(int val) { + ListNode *node; + node = (ListNode *) malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + return node; + } + ``` + +=== "Zig" + + ```zig title="" + // Linked List Node Class + pub fn ListNode(comptime T: type) type { + return struct { + const Self = @This(); + + val: T = 0, // Node value + next: ?*Self = null, // Pointer to the next node + + // Constructor + pub fn init(self: *Self, x: i32) void { + self.val = x; + self.next = null; + } + }; + } + ``` + +## Common Operations on Linked Lists + +### Initializing a Linked List + +Building a linked list involves two steps: initializing each node object and then establishing the references between nodes. Once initialized, we can access all nodes sequentially from the head node via the `next` reference. + +=== "Python" + + ```python title="linked_list.py" + # Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 + # Initialize each node + n0 = ListNode(1) + n1 = ListNode(3) + n2 = ListNode(2) + n3 = ListNode(5) + n4 = ListNode(4) + # Build references between nodes + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + ``` + +=== "C++" + + ```cpp title="linked_list.cpp" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + ListNode* n0 = new ListNode(1); + ListNode* n1 = new ListNode(3); + ListNode* n2 = new ListNode(2); + ListNode* n3 = new ListNode(5); + ListNode* n4 = new ListNode(4); + // Build references between nodes + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + ``` + +=== "Java" + + ```java title="linked_list.java" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + ListNode n0 = new ListNode(1); + ListNode n1 = new ListNode(3); + ListNode n2 = new ListNode(2); + ListNode n3 = new ListNode(5); + ListNode n4 = new ListNode(4); + // Build references between nodes + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "C#" + + ```csharp title="linked_list.cs" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + ListNode n0 = new(1); + ListNode n1 = new(3); + ListNode n2 = new(2); + ListNode n3 = new(5); + ListNode n4 = new(4); + // Build references between nodes + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Go" + + ```go title="linked_list.go" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + n0 := NewListNode(1) + n1 := NewListNode(3) + n2 := NewListNode(2) + n3 := NewListNode(5) + n4 := NewListNode(4) + // Build references between nodes + n0.Next = n1 + n1.Next = n2 + n2.Next = n3 + n3.Next = n4 + ``` + +=== "Swift" + + ```swift title="linked_list.swift" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + let n0 = ListNode(x: 1) + let n1 = ListNode(x: 3) + let n2 = ListNode(x: 2) + let n3 = ListNode(x: 5) + let n4 = ListNode(x: 4) + // Build references between nodes + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + ``` + +=== "JS" + + ```javascript title="linked_list.js" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + const n0 = new ListNode(1); + const n1 = new ListNode(3); + const n2 = new ListNode(2); + const n3 = new ListNode(5); + const n4 = new ListNode(4); + // Build references between nodes + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "TS" + + ```typescript title="linked_list.ts" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + const n0 = new ListNode(1); + const n1 = new ListNode(3); + const n2 = new ListNode(2); + const n3 = new ListNode(5); + const n4 = new ListNode(4); + // Build references between nodes + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Dart" + + ```dart title="linked_list.dart" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + ListNode n0 = ListNode(1); + ListNode n1 = ListNode(3); + ListNode n2 = ListNode(2); + ListNode n3 = ListNode(5); + ListNode n4 = ListNode(4); + // Build references between nodes + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Rust" + + ```rust title="linked_list.rs" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + let n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None })); + let n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None })); + let n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None })); + let n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None })); + let n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None })); + + // Build references between nodes + n0.borrow_mut().next = Some(n1.clone()); + n1.borrow_mut().next = Some(n2.clone()); + n2.borrow_mut().next = Some(n3.clone()); + n3.borrow_mut().next = Some(n4.clone()); + ``` + +=== "C" + + ```c title="linked_list.c" + /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */ + // Initialize each node + ListNode* n0 = newListNode(1); + ListNode* n1 = newListNode(3); + ListNode* n2 = newListNode(2); + ListNode* n3 = newListNode(5); + ListNode* n4 = newListNode(4); + // Build references between nodes + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + ``` + +=== "Zig" + + ```zig title="linked_list.zig" + // Initialize linked list + // Initialize each node + var n0 = inc.ListNode(i32){.val = 1}; + var n1 = inc.ListNode(i32){.val = 3}; + var n2 = inc.ListNode(i32){.val = 2}; + var n3 = inc.ListNode(i32){.val = 5}; + var n4 = inc.ListNode(i32){.val = 4}; + // Build references between nodes + n0.next = &n1; + n1.next = &n2; + n2.next = &n3; + n3.next = &n4; + ``` + +An array is a single variable, such as the array `nums` containing elements `nums[0]`, `nums[1]`, etc., while a linked list is composed of multiple independent node objects. **We usually refer to the linked list by its head node**, as in the linked list `n0` in the above code. + +### Inserting a Node + +Inserting a node in a linked list is very easy. As shown in the image below, suppose we want to insert a new node `P` between two adjacent nodes `n0` and `n1`. **This requires changing only two node references (pointers)**, with a time complexity of $O(1)$. + +In contrast, the time complexity of inserting an element in an array is $O(n)$, which is less efficient with large data volumes. + +![Linked List Node Insertion Example](linked_list.assets/linkedlist_insert_node.png) + +```src +[file]{linked_list}-[class]{}-[func]{insert} +``` + +### Deleting a Node + +As shown below, deleting a node in a linked list is also very convenient, **requiring only the change of one node's reference (pointer)**. + +Note that although node `P` still points to `n1` after the deletion operation is completed, it is no longer accessible when traversing the list, meaning `P` is no longer part of the list. + +![Linked List Node Deletion](linked_list.assets/linkedlist_remove_node.png) + +```src +[file]{linked_list}-[class]{}-[func]{remove} +``` + +### Accessing Nodes + +**Accessing nodes in a linked list is less efficient**. As mentioned earlier, any element in an array can be accessed in $O(1)$ time. However, in a linked list, the program needs to start from the head node and traverse each node sequentially until it finds the target node. That is, accessing the $i$-th node of a linked list requires $i - 1$ iterations, with a time complexity of $O(n)$. + +```src +[file]{linked_list}-[class]{}-[func]{access} +``` + +### Finding Nodes + +Traverse the linked list to find a node with a value equal to `target`, and output the index of that node in the linked list. This process also falls under linear search. The code is as follows: + +```src +[file]{linked_list}-[class]{}-[func]{find} +``` + +## Arrays vs. Linked Lists + +The following table summarizes the characteristics of arrays and linked lists and compares their operational efficiencies. Since they employ two opposite storage strategies, their properties and operational efficiencies also show contrasting features. + +

Table   Efficiency Comparison of Arrays and Linked Lists

+ +| | Arrays | Linked Lists | +| ------------------ | ------------------------------------------------ | ----------------------- | +| Storage | Contiguous Memory Space | Dispersed Memory Space | +| Capacity Expansion | Fixed Length | Flexible Expansion | +| Memory Efficiency | Less Memory per Element, Potential Space Wastage | More Memory per Element | +| Accessing Elements | $O(1)$ | $O(n)$ | +| Adding Elements | $O(n)$ | $O(1)$ | +| Deleting Elements | $O(n)$ | $O(1)$ | + +## Common Types of Linked Lists + +As shown in the following image, there are three common types of linked lists. + +- **Singly Linked List**: This is the regular linked list introduced earlier. The nodes of a singly linked list contain the value and a reference to the next node. The first node is called the head node, and the last node, pointing to null (`None`), is the tail node. +- **Circular Linked List**: If the tail node of a singly linked list points back to the head node (forming a loop), it becomes a circular linked list. In a circular linked list, any node can be considered the head node. +- **Doubly Linked List**: Compared to a singly linked list, a doubly linked list stores references in two directions. Its nodes contain references to both the next (successor) and the previous (predecessor) nodes. Doubly linked lists are more flexible as they allow traversal in both directions but require more memory space. + +=== "Python" + + ```python title="" + class ListNode: + """Bidirectional linked list node class"""" + def __init__(self, val: int): + self.val: int = val # Node value + self.next: ListNode | None = None # Reference to the successor node + self.prev: ListNode | None = None # Reference to a predecessor node + ``` + +=== "C++" + + ```cpp title="" + /* Bidirectional linked list node structure */ + struct ListNode { + int val; // Node value + ListNode *next; // Pointer to the successor node + ListNode *prev; // Pointer to the predecessor node + ListNode(int x) : val(x), next(nullptr), prev(nullptr) {} // Constructor + }; + ``` + +=== "Java" + + ```java title="" + /* Bidirectional linked list node class */ + class ListNode { + int val; // Node value + ListNode next; // Reference to the next node + ListNode prev; // Reference to the predecessor node + ListNode(int x) { val = x; } // Constructor + } + ``` + +=== "C#" + + ```csharp title="" + /* Bidirectional linked list node class */ + class ListNode(int x) { // Constructor + int val = x; // Node value + ListNode next; // Reference to the next node + ListNode prev; // Reference to the predecessor node + } + ``` + +=== "Go" + + ```go title="" + /* Bidirectional linked list node structure */ + type DoublyListNode struct { + Val int // Node value + Next *DoublyListNode // Pointer to the successor node + Prev *DoublyListNode // Pointer to the predecessor node + } + + // NewDoublyListNode initialization + func NewDoublyListNode(val int) *DoublyListNode { + return &DoublyListNode{ + Val: val, + Next: nil, + Prev: nil, + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Bidirectional linked list node class */ + class ListNode { + var val: Int // Node value + var next: ListNode? // Reference to the next node + var prev: ListNode? // Reference to the predecessor node + + init(x: Int) { // Constructor + val = x + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Bidirectional linked list node class */ + class ListNode { + constructor(val, next, prev) { + this.val = val === undefined ? 0 : val; // Node value + this.next = next === undefined ? null : next; // Reference to the successor node + this.prev = prev === undefined ? null : prev; // Reference to the predecessor node + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Bidirectional linked list node class */ + class ListNode { + val: number; + next: ListNode | null; + prev: ListNode | null; + constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) { + this.val = val === undefined ? 0 : val; // Node value + this.next = next === undefined ? null : next; // Reference to the successor node + this.prev = prev === undefined ? null : prev; // Reference to the predecessor node + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Bidirectional linked list node class */ + class ListNode { + int val; // Node value + ListNode next; // Reference to the next node + ListNode prev; // Reference to the predecessor node + ListNode(this.val, [this.next, this.prev]); // Constructor + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + + /* Bidirectional linked list node type */ + #[derive(Debug)] + struct ListNode { + val: i32, // Node value + next: Option>>, // Pointer to successor node + prev: Option>>, // Pointer to predecessor node + } + + /* Constructors */ + impl ListNode { + fn new(val: i32) -> Self { + ListNode { + val, + next: None, + prev: None, + } + } + } + ``` + +=== "C" + + ```c title="" + /* Bidirectional linked list node structure */ + typedef struct ListNode { + int val; // Node value + struct ListNode *next; // Pointer to the successor node + struct ListNode *prev; // Pointer to the predecessor node + } ListNode; + + /* Constructors */ + ListNode *newListNode(int val) { + ListNode *node, *next; + node = (ListNode *) malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + node->prev = NULL; + return node; + } + ``` + +=== "Zig" + + ```zig title="" + // Bidirectional linked list node class + pub fn ListNode(comptime T: type) type { + return struct { + const Self = @This(); + + val: T = 0, // Node value + next: ?*Self = null, // Pointer to the successor node + prev: ?*Self = null, // Pointer to the predecessor node + + // Constructor + pub fn init(self: *Self, x: i32) void { + self.val = x; + self.next = null; + self.prev = null; + } + }; + } + ``` + +![Common Types of Linked Lists](linked_list.assets/linkedlist_common_types.png) + +## Typical Applications of Linked Lists + +Singly linked lists are commonly used to implement stacks, queues, hash tables, and graphs. + +- **Stacks and Queues**: When insertion and deletion operations are performed at one end of the linked list, it exhibits last-in-first-out characteristics, corresponding to a stack. When insertion is at one end and deletion is at the other, it shows first-in-first-out characteristics, corresponding to a queue. +- **Hash Tables**: Chaining is one of the mainstream solutions to hash collisions, where all colliding elements are placed in a linked list. +- **Graphs**: Adjacency lists are a common way to represent graphs, where each vertex is associated with a linked list. Each element in the list represents other vertices connected to that vertex. + +Doubly linked lists are commonly used in scenarios that require quick access to the previous and next elements. + +- **Advanced Data Structures**: For example, in red-black trees and B-trees, we need to access a node's parent, which can be achieved by storing a reference to the parent node in each node, similar to a doubly linked list. +- **Browser History**: In web browsers, when a user clicks the forward or backward button, the browser needs to know the previously and next visited web pages. The properties of a doubly linked list make this operation simple. +- **LRU Algorithm**: In Least Recently Used (LRU) cache eviction algorithms, we need to quickly find the least recently used data and support rapid addition and deletion of nodes. Here, using a doubly linked list is very appropriate. + +Circular linked lists are commonly used in scenarios requiring periodic operations, such as resource scheduling in operating systems. + +- **Round-Robin Scheduling Algorithm**: In operating systems, the round-robin scheduling algorithm is a common CPU scheduling algorithm that cycles through a group of processes. Each process is assigned a time slice, and when it expires, the CPU switches to the next process. This circular operation can be implemented using a circular linked list. +- **Data Buffers**: Circular linked lists may also be used in some data buffer implementations. For instance, in audio and video players, the data stream might be divided into multiple buffer blocks placed in a circular linked list to achieve seamless playback. diff --git a/docs-en/chapter_array_and_linkedlist/list.md b/docs-en/chapter_array_and_linkedlist/list.md new file mode 100755 index 00000000..d62f8d97 --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/list.md @@ -0,0 +1,870 @@ +# List + +A "list" is an abstract data structure concept, representing an ordered collection of elements. It supports operations like element access, modification, addition, deletion, and traversal, without requiring users to consider capacity limitations. Lists can be implemented based on linked lists or arrays. + +- A linked list naturally functions as a list, supporting operations for adding, deleting, searching, and modifying elements, and can dynamically adjust its size. +- Arrays also support these operations, but due to their fixed length, they can be considered as a list with a length limit. + +When using arrays to implement lists, **the fixed length property reduces the practicality of the list**. This is because we often cannot determine in advance how much data needs to be stored, making it difficult to choose an appropriate list length. If the length is too small, it may not meet the requirements; if too large, it may waste memory space. + +To solve this problem, we can use a "dynamic array" to implement lists. It inherits the advantages of arrays and can dynamically expand during program execution. + +In fact, **many programming languages' standard libraries implement lists using dynamic arrays**, such as Python's `list`, Java's `ArrayList`, C++'s `vector`, and C#'s `List`. In the following discussion, we will consider "list" and "dynamic array" as synonymous concepts. + +## Common List Operations + +### Initializing a List + +We typically use two methods of initialization: "without initial values" and "with initial values". + +=== "Python" + + ```python title="list.py" + # Initialize list + # Without initial values + nums1: list[int] = [] + # With initial values + nums: list[int] = [1, 3, 2, 5, 4] + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Initialize list */ + // Note, in C++ the vector is the equivalent of nums described here + // Without initial values + vector nums1; + // With initial values + vector nums = { 1, 3, 2, 5, 4 }; + ``` + +=== "Java" + + ```java title="list.java" + /* Initialize list */ + // Without initial values + List nums1 = new ArrayList<>(); + // With initial values (note the element type should be the wrapper class Integer[] for int[]) + Integer[] numbers = new Integer[] { 1, 3, 2, 5, 4 }; + List nums = new ArrayList<>(Arrays.asList(numbers)); + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Initialize list */ + // Without initial values + List nums1 = []; + // With initial values + int[] numbers = [1, 3, 2, 5, 4]; + List nums = [.. numbers]; + ``` + +=== "Go" + + ```go title="list_test.go" + /* Initialize list */ + // Without initial values + nums1 := []int{} + // With initial values + nums := []int{1, 3, 2, 5, 4} + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Initialize list */ + // Without initial values + let nums1: [Int] = [] + // With initial values + var nums = [1, 3, 2, 5, 4] + ``` + +=== "JS" + + ```javascript title="list.js" + /* Initialize list */ + // Without initial values + const nums1 = []; + // With initial values + const nums = [1, 3, 2, 5, 4]; + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Initialize list */ + // Without initial values + const nums1: number[] = []; + // With initial values + const nums: number[] = [1, 3, 2, 5, 4]; + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Initialize list */ + // Without initial values + List nums1 = []; + // With initial values + List nums = [1, 3, 2, 5, 4]; + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Initialize list */ + // Without initial values + let nums1: Vec = Vec::new(); + // With initial values + let nums: Vec = vec![1, 3, 2, 5, 4]; + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Initialize list + var nums = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums.deinit(); + try nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 }); + ``` + +### Accessing Elements + +Lists are essentially arrays, so accessing and updating elements can be done in $O(1)$ time, which is very efficient. + +=== "Python" + + ```python title="list.py" + # Access elements + num: int = nums[1] # Access the element at index 1 + + # Update elements + nums[1] = 0 # Update the element at index 1 to 0 + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Access elements */ + int num = nums[1]; // Access the element at index 1 + + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "Java" + + ```java title="list.java" + /* Access elements */ + int num = nums.get(1); // Access the element at index 1 + + /* Update elements */ + nums.set(1, 0); // Update the element at index 1 to 0 + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Access elements */ + int num = nums[1]; // Access the element at index 1 + + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "Go" + + ```go title="list_test.go" + /* Access elements */ + num := nums[1] // Access the element at index 1 + + /* Update elements */ + nums[1] = 0 // Update the element at index 1 to 0 + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Access elements */ + let num = nums[1] // Access the element at index 1 + + /* Update elements */ + nums[1] = 0 // Update the element at index 1 to 0 + ``` + +=== "JS" + + ```javascript title="list.js" + /* Access elements */ + const num = nums[1]; // Access the element at index 1 + + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Access elements */ + const num: number = nums[1]; // Access the element at index 1 + + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Access elements */ + int num = nums[1]; // Access the element at index 1 + + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Access elements */ + let num: i32 = nums[1]; // Access the element at index 1 + /* Update elements */ + nums[1] = 0; // Update the element at index 1 to 0 + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Access elements + var num = nums.items[1]; // Access the element at index 1 + + // Update elements + nums.items[1] = 0; // Update the element at index 1 to 0 + ``` + +### Inserting and Deleting Elements + +Compared to arrays, lists can freely add and remove elements. Adding elements at the end of the list has a time complexity of $O(1)$, but the efficiency of inserting and deleting elements is still the same as in arrays, with a time complexity of $O(n)$. + +=== "Python" + + ```python title="list.py" + # Clear list + nums.clear() + + # Append elements at the end + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + + # Insert element in the middle + nums.insert(3, 6) # Insert number 6 at index 3 + + # Remove elements + nums.pop(3) # Remove the element at index 3 + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Clear list */ + nums.clear(); + + /* Append elements at the end */ + nums.push_back(1); + nums.push_back(3); + nums.push_back(2); + nums.push_back(5); + nums.push_back(4); + + /* Insert element in the middle */ + nums.insert(nums.begin() + 3, 6); // Insert number 6 at index 3 + + /* Remove elements */ + nums.erase(nums.begin() + 3); // Remove the element at index 3 + ``` + +=== "Java" + + ```java title="list.java" + /* Clear list */ + nums.clear(); + + /* Append elements at the end */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + + /* Insert element in the middle */ + nums.add(3, 6); // Insert number 6 at index 3 + + /* Remove elements */ + nums.remove(3); // Remove the element at index 3 + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Clear list */ + nums.Clear(); + + /* Append elements at the end */ + nums.Add(1); + nums.Add(3); + nums.Add(2); + nums.Add(5); + nums.Add(4); + + /* Insert element in the middle */ + nums.Insert(3, 6); + + /* Remove elements */ + nums.RemoveAt(3); + ``` + +=== "Go" + + ```go title="list_test.go" + /* Clear list */ + nums = nil + + /* Append elements at the end */ + nums = append(nums, 1) + nums = append(nums, 3) + nums = append(nums, 2) + nums = append(nums, 5) + nums = append(nums, 4) + + /* Insert element in the middle */ + nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Insert number 6 at index 3 + + /* Remove elements */ + nums = append(nums[:3], nums[4:]...) // Remove the element at index 3 + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Clear list */ + nums.removeAll() + + /* Append elements at the end */ + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + + /* Insert element in the middle */ + nums.insert(6, at: 3) // Insert number 6 at index 3 + + /* Remove elements */ + nums.remove(at: 3) // Remove the element at index 3 + ``` + +=== "JS" + + ```javascript title="list.js" + /* Clear list */ + nums.length = 0; + + /* Append elements at the end */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Insert element in the middle */ + nums.splice(3, 0, 6); + + /* Remove elements */ + nums.splice(3, 1); + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Clear list */ + nums.length = 0; + + /* Append elements at the end */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Insert element in the middle */ + nums.splice(3, 0, 6); + + /* Remove elements */ + nums.splice(3, 1); + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Clear list */ + nums.clear(); + + /* Append elements at the end */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + + /* Insert element in the middle */ + nums.insert(3, 6); // Insert number 6 at index 3 + + /* Remove elements */ + nums.removeAt(3); // Remove the element at index 3 + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Clear list */ + nums.clear(); + + /* Append elements at the end */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Insert element in the middle */ + nums.insert(3, 6); // Insert number 6 at index 3 + + /* Remove elements */ + nums.remove(3); // Remove the element at index 3 + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Clear list + nums.clearRetainingCapacity(); + + // Append elements at the end + try nums.append(1); + try nums.append(3); + try nums.append(2); + try nums.append(5); + try nums.append(4); + + // Insert element in the middle + try nums.insert(3, 6); // Insert number 6 at index 3 + + // Remove elements + _ = nums.orderedRemove(3); // Remove the element at index 3 + ``` + +### Traversing the List + +Like arrays, lists can be traversed based on index, or by directly iterating over each element. + +=== "Python" + + ```python title="list.py" + # Iterate through the list by index + count = 0 + for i in range(len(nums)): + count += nums[i] + + # Iterate directly through list elements + for num in nums: + count += num + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Iterate through the list by index */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums[i]; + } + + /* Iterate directly through list elements */ + count = 0; + for (int num : nums) { + count += num; + } + ``` + +=== "Java" + + ```java title="list.java" + /* Iterate through the list by index */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums.get(i); + } + + /* Iterate directly through list elements */ + for (int num : nums) { + count += num; + } + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Iterate through the list by index */ + int count = 0; + for (int i = 0; i < nums.Count; i++) { + count += nums[i]; + } + + /* Iterate directly through list elements */ + count = 0; + foreach (int num in nums) { + count += num; + } + ``` + +=== "Go" + + ```go title="list_test.go" + /* Iterate through the list by index */ + count := 0 + for i := 0; i < len(nums); i++ { + count += nums[i] + } + + /* Iterate directly through list elements */ + count = 0 + for _, num := range nums { + count += num + } + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Iterate through the list by index */ + var count = 0 + for i in nums.indices { + count += nums[i] + } + + /* Iterate directly through list elements */ + count = 0 + for num in nums { + count += num + } + ``` + +=== "JS" + + ```javascript title="list.js" + /* Iterate through the list by index */ + let count = 0; + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Iterate directly through list elements */ + count = 0; + for (const num of nums) { + count += num; + } + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Iterate through the list by index */ + let count = 0; + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Iterate directly through list elements */ + count = 0; + for (const num of nums) { + count += num; + } + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Iterate through the list by index */ + int count = 0; + for (var i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Iterate directly through list elements */ + count = 0; + for (var num in nums) { + count += num; + } + ``` + +=== "Rust" + + ```rust title="list.rs" + // Iterate through the list by index + let mut _count = 0; + for i in 0..nums.len() { + _count += nums[i]; + } + + // Iterate directly through list elements + _count = 0; + for num in &nums { + _count += num; + } + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Iterate through the list by index + var count: i32 = 0; + var i: i32 = 0; + while (i < nums.items.len) : (i += 1) { + count += nums[i]; + } + + // Iterate directly through list elements + count = 0; + for (nums.items) |num| { + count += num; + } + ``` + +### Concatenating Lists + +Given a new list `nums1`, we can append it to the end of the original list. + +=== "Python" + + ```python title="list.py" + # Concatenate two lists + nums1: list[int] = [6, 8, 7, 10, 9] + nums += nums1 # Concatenate nums1 to the end of nums + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Concatenate two lists */ + vector nums1 = { 6, 8, 7, 10, 9 }; + // Concatenate nums1 to the end of nums + nums.insert(nums.end(), nums1.begin(), nums1.end()); + ``` + +=== "Java" + + ```java title="list.java" + /* Concatenate two lists */ + List nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 })); + nums.addAll(nums1); // Concatenate nums1 to the end of nums + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Concatenate two lists */ + List nums1 = [6, 8, 7, 10, 9]; + nums.AddRange(nums1); // Concatenate nums1 to the end of nums + ``` + +=== "Go" + + ```go title="list_test.go" + /* Concatenate two lists */ + nums1 := []int{6, 8, 7, 10, 9} + nums = append(nums, nums1...) // Concatenate nums1 to the end of nums + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Concatenate two lists */ + let nums1 = [6, 8, 7, 10, 9] + nums.append(contentsOf: nums1) // Concatenate nums1 to the end of nums + ``` + +=== "JS" + + ```javascript title="list.js" + /* Concatenate two lists */ + const nums1 = [6, 8, 7, 10, 9]; + nums.push(...nums1); // Concatenate nums1 to the end of nums + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Concatenate two lists */ + const nums1: number[] = [6, 8, 7, 10, 9]; + nums.push(...nums1); // Concatenate nums1 to the end of nums + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Concatenate two lists */ + List nums1 = [6, 8, 7, 10, 9]; + nums.addAll(nums1); // Concatenate nums1 to the end of nums + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Concatenate two lists */ + let nums1: Vec = vec![6, 8, 7, 10, 9]; + nums.extend(nums1); + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Concatenate two lists + var nums1 = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums1.deinit(); + try nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 }); + try nums.insertSlice(nums.items.len, nums1.items); // Concatenate nums1 to the end of nums + ``` + +### Sorting the List + +After sorting the list, we can use algorithms often tested in array-related algorithm problems, such as "binary search" and "two-pointer" algorithms. + +=== "Python" + + ```python title="list.py" + # Sort the list + nums.sort() # After sorting, the list elements are in ascending order + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Sort the list */ + sort(nums.begin(), nums.end()); // After sorting, the list elements are in ascending order + ``` + +=== "Java" + + ```java title="list.java" + /* Sort the list */ + Collections.sort(nums); // After sorting, the list elements are in ascending order + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Sort the list */ + nums.Sort(); // After sorting, the list elements are in ascending order + ``` + +=== "Go" + + ```go title="list_test.go" + /* Sort the list */ + sort.Ints(nums) // After sorting, the list elements are in ascending order + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Sort the list */ + nums.sort() // After sorting, the list elements are in ascending order + ``` + +=== "JS" + + ```javascript title="list.js" + /* Sort the list */ + nums.sort((a, b) => a - b); // After sorting, the list elements are in ascending order + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Sort the list */ + nums.sort((a, b) => a - b); // After sorting, the list elements are in ascending order + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Sort the list */ + nums.sort(); // After sorting, the list elements are in ascending order + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Sort the list */ + nums.sort(); // After sorting, the list elements are in ascending order + ``` + +=== "C" + + ```c title="list.c" + // C does not provide built-in dynamic arrays + ``` + +=== "Zig" + + ```zig title="list.zig" + // Sort the list + std.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32)); + ``` + +## List Implementation + +Many programming languages have built-in lists, such as Java, C++, Python, etc. Their implementations are quite complex, with very meticulous settings for parameters such as initial capacity and expansion multiplier. Interested readers can refer to the source code for learning. + +To deepen the understanding of how lists work, let's try implementing a simple version of a list, focusing on three key designs. + +- **Initial Capacity**: Choose a reasonable initial capacity for the array. In this example, we choose 10 as the initial capacity. +- **Size Recording**: Declare a variable `size` to record the current number of elements in the list, updating in real-time with element insertion and deletion. With this variable, we can locate the end of the list and determine whether expansion is needed. +- **Expansion Mechanism**: If the list's capacity is full when inserting an element, expansion is necessary. First, create a larger array based on the expansion multiplier, then move all elements of the current array to the new array. In this example, we define that each time the array will expand to twice its previous size. + +```src +[file]{my_list}-[class]{my_list}-[func]{} +``` diff --git a/docs-en/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png b/docs-en/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2af92eec42c19b30c14e3d734d1f5218c39abc GIT binary patch literal 12981 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%0AQ{dBe^3`o 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 b5fM#Kx)uC-eBBp*00000NkvXXu0mjfdBQo+ literal 0 HcmV?d00001 diff --git a/docs-en/chapter_array_and_linkedlist/ram_and_cache.md b/docs-en/chapter_array_and_linkedlist/ram_and_cache.md new file mode 100644 index 00000000..3f9ff47d --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/ram_and_cache.md @@ -0,0 +1,71 @@ +# Memory and Cache * + +In the first two sections of this chapter, we explored arrays and linked lists, two fundamental and important data structures, representing "continuous storage" and "dispersed storage" respectively. + +In fact, **the physical structure largely determines the efficiency of a program's use of memory and cache**, which in turn affects the overall performance of the algorithm. + +## Computer Storage Devices + +There are three types of storage devices in computers: "hard disk," "random-access memory (RAM)," and "cache memory." The following table shows their different roles and performance characteristics in computer systems. + +

Table   Computer Storage Devices

+ +| | Hard Disk | Memory | Cache | +| ---------- | -------------------------------------------------------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | +| Usage | Long-term storage of data, including OS, programs, files, etc. | Temporary storage of currently running programs and data being processed | Stores frequently accessed data and instructions, reducing the number of CPU accesses to memory | +| Volatility | Data is not lost after power off | Data is lost after power off | Data is lost after power off | +| Capacity | Larger, TB level | Smaller, GB level | Very small, MB level | +| Speed | Slower, several hundred to thousands MB/s | Faster, several tens of GB/s | Very fast, several tens to hundreds of GB/s | +| Price | Cheaper, several cents to yuan / GB | More expensive, tens to hundreds of yuan / GB | Very expensive, priced with CPU | + +We can imagine the computer storage system as a pyramid structure shown in the figure below. The storage devices closer to the top of the pyramid are faster, have smaller capacity, and are more costly. This multi-level design is not accidental, but the result of careful consideration by computer scientists and engineers. + +- **Hard disks are difficult to replace with memory**. Firstly, data in memory is lost after power off, making it unsuitable for long-term data storage; secondly, the cost of memory is dozens of times that of hard disks, making it difficult to popularize in the consumer market. +- **It is difficult for caches to have both large capacity and high speed**. As the capacity of L1, L2, L3 caches gradually increases, their physical size becomes larger, increasing the physical distance from the CPU core, leading to increased data transfer time and higher element access latency. Under current technology, a multi-level cache structure is the best balance between capacity, speed, and cost. + +![Computer Storage System](ram_and_cache.assets/storage_pyramid.png) + +!!! note + + The storage hierarchy of computers reflects a delicate balance between speed, capacity, and cost. In fact, this kind of trade-off is common in all industrial fields, requiring us to find the best balance between different advantages and limitations. + +Overall, **hard disks are used for long-term storage of large amounts of data, memory is used for temporary storage of data being processed during program execution, and cache is used to store frequently accessed data and instructions** to improve program execution efficiency. Together, they ensure the efficient operation of computer systems. + +As shown in the figure below, during program execution, data is read from the hard disk into memory for CPU computation. The cache can be considered a part of the CPU, **smartly loading data from memory** to provide fast data access to the CPU, significantly enhancing program execution efficiency and reducing reliance on slower memory. + +![Data Flow Between Hard Disk, Memory, and Cache](ram_and_cache.assets/computer_storage_devices.png) + +## Memory Efficiency of Data Structures + +In terms of memory space utilization, arrays and linked lists have their advantages and limitations. + +On one hand, **memory is limited and cannot be shared by multiple programs**, so we hope that data structures can use space as efficiently as possible. The elements of an array are tightly packed without extra space for storing references (pointers) between linked list nodes, making them more space-efficient. However, arrays require allocating sufficient continuous memory space at once, which may lead to memory waste, and array expansion also requires additional time and space costs. In contrast, linked lists allocate and reclaim memory dynamically on a per-node basis, providing greater flexibility. + +On the other hand, during program execution, **as memory is repeatedly allocated and released, the degree of fragmentation of free memory becomes higher**, leading to reduced memory utilization efficiency. Arrays, due to their continuous storage method, are relatively less likely to cause memory fragmentation. In contrast, the elements of a linked list are dispersedly stored, and frequent insertion and deletion operations make memory fragmentation more likely. + +## Cache Efficiency of Data Structures + +Although caches are much smaller in space capacity than memory, they are much faster and play a crucial role in program execution speed. Since the cache's capacity is limited and can only store a small part of frequently accessed data, when the CPU tries to access data not in the cache, a "cache miss" occurs, forcing the CPU to load the needed data from slower memory. + +Clearly, **the fewer the cache misses, the higher the CPU's data read-write efficiency**, and the better the program performance. The proportion of successful data retrieval from the cache by the CPU is called the "cache hit rate," a metric often used to measure cache efficiency. + +To achieve higher efficiency, caches adopt the following data loading mechanisms. + +- **Cache Lines**: Caches don't store and load data byte by byte but in units of cache lines. Compared to byte-by-byte transfer, the transmission of cache lines is more efficient. +- **Prefetch Mechanism**: Processors try to predict data access patterns (such as sequential access, fixed stride jumping access, etc.) and load data into the cache according to specific patterns to improve the hit rate. +- **Spatial Locality**: If data is accessed, data nearby is likely to be accessed in the near future. Therefore, when loading certain data, the cache also loads nearby data to improve the hit rate. +- **Temporal Locality**: If data is accessed, it's likely to be accessed again in the near future. Caches use this principle to retain recently accessed data to improve the hit rate. + +In fact, **arrays and linked lists have different cache utilization efficiencies**, mainly reflected in the following aspects. + +- **Occupied Space**: Linked list elements occupy more space than array elements, resulting in less effective data volume in the cache. +- **Cache Lines**: Linked list data is scattered throughout memory, and since caches load "by line," the proportion of loading invalid data is higher. +- **Prefetch Mechanism**: The data access pattern of arrays is more "predictable" than that of linked lists, meaning the system is more likely to guess which data will be loaded next. +- **Spatial Locality**: Arrays are stored in concentrated memory spaces, so the data near the loaded data is more likely to be accessed next. + +Overall, **arrays have a higher cache hit rate and are generally more efficient in operation than linked lists**. This makes data structures based on arrays more popular in solving algorithmic problems. + +It should be noted that **high cache efficiency does not mean that arrays are always better than linked lists**. Which data structure to choose in actual applications should be based on specific requirements. For example, both arrays and linked lists can implement the "stack" data structure (which will be detailed in the next chapter), but they are suitable for different scenarios. + +- In algorithm problems, we tend to choose stacks based on arrays because they provide higher operational efficiency and random access capabilities, with the only cost being the need to pre-allocate a certain amount of memory space for the array. +- If the data volume is very large, highly dynamic, and the expected size of the stack is difficult to estimate, then a stack based on a linked list is more appropriate. Linked lists can disperse a large amount of data in different parts of the memory and avoid the additional overhead of array expansion. diff --git a/docs-en/chapter_array_and_linkedlist/summary.md b/docs-en/chapter_array_and_linkedlist/summary.md new file mode 100644 index 00000000..3effb5e5 --- /dev/null +++ b/docs-en/chapter_array_and_linkedlist/summary.md @@ -0,0 +1,81 @@ +# Summary + +### Key Review + +- Arrays and linked lists are two fundamental data structures, representing two storage methods in computer memory: continuous space storage and dispersed space storage. Their characteristics complement each other. +- Arrays support random access and use less memory; however, they are inefficient in inserting and deleting elements and have a fixed length after initialization. +- Linked lists implement efficient node insertion and deletion through changing references (pointers) and can flexibly adjust their length; however, they have lower node access efficiency and use more memory. +- Common types of linked lists include singly linked lists, circular linked lists, and doubly linked lists, each with its own application scenarios. +- Lists are ordered collections of elements that support addition, deletion, and modification, typically implemented based on dynamic arrays, retaining the advantages of arrays while allowing flexible length adjustment. +- The advent of lists significantly enhanced the practicality of arrays but may lead to some memory space wastage. +- During program execution, data is mainly stored in memory. Arrays provide higher memory space efficiency, while linked lists are more flexible in memory usage. +- Caches provide fast data access to CPUs through mechanisms like cache lines, prefetching, spatial locality, and temporal locality, significantly enhancing program execution efficiency. +- Due to higher cache hit rates, arrays are generally more efficient than linked lists. When choosing a data structure, the appropriate choice should be made based on specific needs and scenarios. + +### Q & A + +!!! question "Does storing arrays on the stack versus the heap affect time and space efficiency?" + + Arrays stored on both the stack and heap are stored in continuous memory spaces, and data operation efficiency is essentially the same. However, stacks and heaps have their own characteristics, leading to the following differences. + + 1. Allocation and release efficiency: The stack is a smaller memory block, allocated automatically by the compiler; the heap memory is relatively larger and can be dynamically allocated in the code, more prone to fragmentation. Therefore, allocation and release operations on the heap are generally slower than on the stack. + 2. Size limitation: Stack memory is relatively small, while the heap size is generally limited by available memory. Therefore, the heap is more suitable for storing large arrays. + 3. Flexibility: The size of arrays on the stack needs to be determined at compile-time, while the size of arrays on the heap can be dynamically determined at runtime. + +!!! question "Why do arrays require elements of the same type, while linked lists do not emphasize same-type elements?" + + Linked lists consist of nodes connected by references (pointers), and each node can store data of different types, such as int, double, string, object, etc. + + In contrast, array elements must be of the same type, allowing the calculation of offsets to access the corresponding element positions. For example, an array containing both int and long types, with single elements occupying 4 bytes and 8 bytes respectively, cannot use the following formula to calculate offsets, as the array contains elements of two different lengths. + + ```shell + # Element memory address = Array memory address + Element length * Element index + ``` + +!!! question "After deleting a node, is it necessary to set `P.next` to `None`?" + + Not modifying `P.next` is also acceptable. From the perspective of the linked list, traversing from the head node to the tail node will no longer encounter `P`. This means that node `P` has been effectively removed from the list, and where `P` points no longer affects the list. + + From a garbage collection perspective, for languages with automatic garbage collection mechanisms like Java, Python, and Go, whether node `P` is collected depends on whether there are still references pointing to it, not on the value of `P.next`. In languages like C and C++, we need to manually free the node's memory. + +!!! question "In linked lists, the time complexity for insertion and deletion operations is `O(1)`. But searching for the element before insertion or deletion takes `O(n)` time, so why isn't the time complexity `O(n)`?" + + If an element is searched first and then deleted, the time complexity is indeed `O(n)`. However, the `O(1)` advantage of linked lists in insertion and deletion can be realized in other applications. For example, in the implementation of double-ended queues using linked lists, we maintain pointers always pointing to the head and tail nodes, making each insertion and deletion operation `O(1)`. + +!!! question "In the image 'Linked List Definition and Storage Method', do the light blue storage nodes occupy a single memory address, or do they share half with the node value?" + + The diagram is just a qualitative representation; quantitative analysis depends on specific situations. + + - Different types of node values occupy different amounts of space, such as int, long, double, and object instances. + - The memory space occupied by pointer variables depends on the operating system and compilation environment used, usually 8 bytes or 4 bytes. + +!!! question "Is adding elements to the end of a list always `O(1)`?" + + If adding an element exceeds the list length, the list needs to be expanded first. The system will request a new memory block and move all elements of the original list over, in which case the time complexity becomes `O(n)`. + +!!! question "The statement 'The emergence of lists greatly improves the practicality of arrays, but may lead to some memory space wastage' - does this refer to the memory occupied by additional variables like capacity, length, and expansion multiplier?" + + The space wastage here mainly refers to two aspects: on the one hand, lists are set with an initial length, which we may not always need; on the other hand, to prevent frequent expansion, expansion usually multiplies by a coefficient, such as $\times 1.5$. This results in many empty slots, which we typically cannot fully fill. + +!!! question "In Python, after initializing `n = [1, 2, 3]`, the addresses of these 3 elements are contiguous, but initializing `m = [2, 1, 3]` shows that each element's `id` is not consecutive but identical to those in `n`. If the addresses of these elements are not contiguous, is `m` still an array?" + + If we replace list elements with linked list nodes `n = [n1, n2, n3, n4, n5]`, these 5 node objects are also typically dispersed throughout memory. However, given a list index, we can still access the node's memory address in `O(1)` time, thereby accessing the corresponding node. This is because the array stores references to the nodes, not the nodes themselves. + + Unlike many languages, in Python, numbers are also wrapped as objects, and lists store references to these numbers, not the numbers themselves. Therefore, we find that the same number in two arrays has the same `id`, and these numbers' memory addresses need not be contiguous. + +!!! question "The `std::list` in C++ STL has already implemented a doubly linked list, but it seems that some algorithm books don't directly use it. Is there any limitation?" + + On the one hand, we often prefer to use arrays to implement algorithms, only using linked lists when necessary, mainly for two reasons. + + - Space overhead: Since each element requires two additional pointers (one for the previous element and one for the next), `std::list` usually occupies more space than `std::vector`. + - Cache unfriendly: As the data is not stored continuously, `std::list` has a lower cache utilization rate. Generally, `std::vector` performs better. + + On the other hand, linked lists are primarily necessary for binary trees and graphs. Stacks and queues are often implemented using the programming language's `stack` and `queue` classes, rather than linked lists. + +!!! question "Does initializing a list `res = [0] * self.size()` result in each element of `res` referencing the same address?" + + No. However, this issue arises with two-dimensional arrays, for example, initializing a two-dimensional list `res = [[0] * self.size()]` would reference the same list `[0]` multiple times. + +!!! question "In deleting a node, is it necessary to break the reference to its successor node?" + + From the perspective of data structures and algorithms (problem-solving), it's okay not to break the link, as long as the program's logic is correct. From the perspective of standard libraries, breaking the link is safer and more logically clear. If the link is not broken, and the deleted node is not properly recycled, it could affect the recycling of the successor node's memory. diff --git a/docs-en/chapter_data_structure/basic_data_types.md b/docs-en/chapter_data_structure/basic_data_types.md index 6d2afa02..6d545551 100644 --- a/docs-en/chapter_data_structure/basic_data_types.md +++ b/docs-en/chapter_data_structure/basic_data_types.md @@ -13,23 +13,23 @@ When we think of data in computers, we imagine various forms like text, images, The range of values for fundamental data types depends on the size of the space they occupy. Below, we take Java as an example. -- The integer type `byte` occupies 1 byte = 8 bits and can represent \(2^8\) numbers. -- The integer type `int` occupies 4 bytes = 32 bits and can represent \(2^{32}\) numbers. +- The integer type `byte` occupies 1 byte = 8 bits and can represent $2^8$ numbers. +- The integer type `int` occupies 4 bytes = 32 bits and can represent $2^{32}$ numbers. The following table lists the space occupied, value range, and default values of various fundamental data types in Java. This table does not need to be memorized, but understood roughly and referred to when needed.

Table   Space Occupied and Value Range of Fundamental Data Types

-| Type | Symbol | Space Occupied | Minimum Value | Maximum Value | Default Value | -| ------- | -------- | -------------- | -------------------------- | ------------------------- | ---------------- | -| Integer | `byte` | 1 byte | \(-2^7\) (\(-128\)) | \(2^7 - 1\) (\(127\)) | 0 | -| | `short` | 2 bytes | \(-2^{15}\) | \(2^{15} - 1\) | 0 | -| | `int` | 4 bytes | \(-2^{31}\) | \(2^{31} - 1\) | 0 | -| | `long` | 8 bytes | \(-2^{63}\) | \(2^{63} - 1\) | 0 | -| Float | `float` | 4 bytes | \(1.175 \times 10^{-38}\) | \(3.403 \times 10^{38}\) | \(0.0\text{f}\) | -| | `double` | 8 bytes | \(2.225 \times 10^{-308}\) | \(1.798 \times 10^{308}\) | 0.0 | -| Char | `char` | 2 bytes | 0 | \(2^{16} - 1\) | 0 | -| Boolean | `bool` | 1 byte | \(\text{false}\) | \(\text{true}\) | \(\text{false}\) | +| Type | Symbol | Space Occupied | Minimum Value | Maximum Value | Default Value | +| ------- | -------- | -------------- | ------------------------ | ----------------------- | -------------- | +| Integer | `byte` | 1 byte | $-2^7$ ($-128$) | $2^7 - 1$ ($127$) | 0 | +| | `short` | 2 bytes | $-2^{15}$ | $2^{15} - 1$ | 0 | +| | `int` | 4 bytes | $-2^{31}$ | $2^{31} - 1$ | 0 | +| | `long` | 8 bytes | $-2^{63}$ | $2^{63} - 1$ | 0 | +| Float | `float` | 4 bytes | $1.175 \times 10^{-38}$ | $3.403 \times 10^{38}$ | $0.0\text{f}$ | +| | `double` | 8 bytes | $2.225 \times 10^{-308}$ | $1.798 \times 10^{308}$ | 0.0 | +| Char | `char` | 2 bytes | 0 | $2^{16} - 1$ | 0 | +| Boolean | `bool` | 1 byte | $\text{false}$ | $\text{true}$ | $\text{false}$ | Please note that the above table is specific to Java's fundamental data types. Each programming language has its own data type definitions, and their space occupied, value ranges, and default values may differ.