📜  资质| GATE CS 1998 |第61章(1)

📅  最后修改于: 2023-12-03 15:28:13.572000             🧑  作者: Mango

资质 | GATE CS 1998 | 第61章

本文主要介绍GATE CS 1998的第61章,重点涵盖了不同主题的算法和数据结构,这些知识是程序员必备的基础知识之一。

动态规划

动态规划是高级算法的重要部分。通过重复分解问题,将其分解为子问题,适用于递归求解的子问题,以最终化解为基础,动态规划有效地解决了许多复杂问题。我们可以从下面的示例开始,了解动态规划的基本用法。

示例

假设我们有一组物体,每个物体都有不同的权重和价值。我们需要选择一组物体,在保持总重量不超过限制的条件下,使总价值最大。我们可以使用递归或动态规划来解决这个问题。

递归解法

def knapsack_recursive(val, wt, n, w):
    if n == 0 or w == 0:
        return 0

    if wt[n-1] > w:
        return knapsack_recursive(val, wt, n-1, w)

    return max(val[n-1] + knapsack_recursive(val, wt, n-1, w-wt[n-1]), knapsack_recursive(val, wt, n-1, w))

动态规划解法

def knapsack_dp(val, wt, n, w):
    dp = [[0 for x in range(w+1)] for x in range(n+1)]

    for i in range(n+1):
        for j in range(w+1):
            if i==0 or j==0:
                dp[i][j] = 0
            elif wt[i-1] <= j:
                dp[i][j] = max(val[i-1] + dp[i-1][j-wt[i-1]], dp[i-1][j])
            else:
                dp[i][j] = dp[i-1][j]

    return dp[n][w]
排序算法

排序算法是计算机科学中最基本和最常用的算法之一,其主要目的是使一组数据按一定顺序排列。排序算法在数据结构和数据库系统等领域中有着广泛的应用。在这里我们介绍三种常见的排序算法。

快速排序

快速排序是一种常用的排序算法,其基本思想是选取一个基准值(pivot),将待排序序列分成两个子序列,其中一个子序列中的所有元素都比基准值小,另一个子序列中的所有元素都比基准值大。然后递归地对子序列进行排序。

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        left = []
        right = []
        for i in range(1, len(arr)):
            if arr[i] < pivot:
                left.append(arr[i])
            else:
                right.append(arr[i])
        return quicksort(left) + [pivot] + quicksort(right)
归并排序

归并排序是另一种基本的排序算法,其基本思想是将待排序序列分成两个子序列,然后递归地对子序列进行排序,最后将两个子序列合并起来。

def mergesort(arr):
    if len(arr) <= 1:
        return arr
    else:
        mid = len(arr) // 2
        left = mergesort(arr[:mid])
        right = mergesort(arr[mid:])
        return merge(left, right)

def merge(left, right):
    i = 0
    j = 0
    merged = []
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1
    merged += left[i:]
    merged += right[j:]
    return merged
堆排序

堆排序是一种基于堆数据结构的排序算法,其基本思想是将待排序序列构建成一个二叉堆,然后逐个将堆顶元素取出放到末尾,重复进行这个过程直至所有元素都排好序。

def heapsort(arr):
    n = len(arr)

    # Build a maxheap.
    for i in range(n, -1, -1):
        heapify(arr, n, i)

    # Extract elements one by one.
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2

    if l < n and arr[l] > arr[largest]:
        largest = l

    if r < n and arr[r] > arr[largest]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
搜索算法

搜索算法是一个重要的领域,主要涉及到在某个范围内查找特定元素的方法。这些算法非常有用,可以优化代码并提高程序的效率。我们介绍两个常见的搜索算法。

二分查找

二分查找是一种常见的搜索算法,适用于有序数据结构。其基本思想是将待搜索区间分成两个子区间,如果要查找元素比中间元素小,则在左边的子区间中继续搜索,否则在右边的子区间中继续搜索。

def binary_search(arr, x):
    low = 0
    high = len(arr) - 1

    while low <= high:
        mid = (low + high) //2
        if arr[mid] < x:
            low = mid + 1
        elif arr[mid] > x:
            high = mid - 1
        else:
            return mid

    return -1
广度优先搜索

广度优先搜索是一种常见的图算法,其基本思想是按照距离的递增顺序遍历和邻接某个节点相连通的所有节点。这种算法通常用于计算最短路径和查找连通性。

def bfs(graph, start):
    visited = set()
    queue = [start]

    while queue:
        node = queue.pop(0)
        if node not in visited:
            visited.add(node)
            queue.extend(graph[node] - visited)

    return visited
哈希表

哈希表是一种数据结构,用于实现关联数组。哈希表可以在平均情况下以常数时间运行基本操作(添加,删除,搜索),因此在许多情况下是一个非常实用的数据结构。下面是哈希表的一个简单示例。

class HashTable:
    def __init__(self):
        self.size = 11
        self.slots = [None] * self.size
        self.data = [None] * self.size

    def put(self, key, value):
        hashvalue = self.hashfunction(key, len(self.slots))

        if self.slots[hashvalue] == None:
            self.slots[hashvalue] = key
            self.data[hashvalue] = value
        else:
            if self.slots[hashvalue] == key:
                self.data[hashvalue] = value  # replace
            else:
                nextslot = self.rehash(hashvalue, len(self.slots))
                while self.slots[nextslot] != None and self.slots[nextslot] != key:
                    nextslot = self.rehash(nextslot, len(self.slots))

                if self.slots[nextslot] == None:
                    self.slots[nextslot] = key
                    self.data[nextslot] = value
                else:
                    self.data[nextslot] = value  # replace

    def get(self, key):
        startslot = self.hashfunction(key, len(self.slots))

        data = None
        stop = False
        found = False
        position = startslot
        while self.slots[position] != None and not found and not stop:
            if self.slots[position] == key:
                found = True
                data = self.data[position]
            else:
                position = self.rehash(position, len(self.slots))
                if position == startslot:
                    stop = True
        return data

    def hashfunction(self, key, size):
        return key % size

    def rehash(self, oldhash, size):
        return (oldhash + 1) % size

以上就是GATE CS 1998的第61章的主要内容。该章节涵盖了许多重要的算法和数据结构,是程序员在基础知识方面的必备参考。