CodeGym /Java 课程 /Python SELF ZH /不同难度级别的任务示例

不同难度级别的任务示例

Python SELF ZH
第 61 级 , 课程 2
可用

3.1 固定复杂度的任务 O(1).

通过索引访问数组元素:

通过索引访问数组元素的操作是固定时间的,因为元素的地址是直接计算出来的。


def get_element(arr, index):
    return arr[index]

在列表开头插入元素 (Deque):

使用双端队列 (deque) 可以在列表开头以固定时间插入元素。


from collections import deque

def insert_element(dq, element):
    dq.appendleft(element)

3.2 线性复杂度的任务 O(n).

数组中的线性查找:

在未排序的数组中查找元素需要线性时间,因为可能需要检查每个元素。


def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

计算数组中的元素数量:

遍历数组中所有元素进行计数需要线性时间。


def count_elements(arr):
    count = 0
    for element in arr:
        count += 1
    return count

3.3 对数复杂度的任务 O(log n).

二分查找:

使用二分查找在已排序的数组中查找元素需要对数时间。


def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

在二叉搜索树中插入元素:

在平衡的二叉搜索树 (BST) 中插入元素需要对数时间。


class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key
        
def insert(root, key):
    if root is None:
        return Node(key)
    if key < root.val:
        root.left = insert(root.left, key)
    else:
        root.right = insert(root.right, key)
    return root

3.4 平方复杂度的任务 O(n^2).

冒泡排序:

使用冒泡排序法对数组进行排序需要平方时间。


def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

通过双重循环检查是否存在重复项:

通过双重循环检查数组是否存在重复项需要平方时间。


def has_duplicates(arr):
    n = len(arr)
    for i in range(n):
        for j in range(i + 1, n):
            if arr[i] == arr[j]:
                return True
    return False

3.5 指数复杂度的任务 O(2^n).

汉诺塔问题:

解决汉诺塔问题需要指数时间,因为需要移动每一个圆盘。


def hanoi(n, source, target, auxiliary):
    if n == 1:
        print(f"Move disk 1 from {source} to {target}")
        return
    hanoi(n - 1, source, auxiliary, target)
    print(f"Move disk {n} from {source} to {target}")
    hanoi(n - 1, auxiliary, target, source)

生成集合的所有子集:

生成集合的所有子集需要指数时间,因为每一个子集都必须被考虑。


def generate_subsets(s):
    result = []
    subset = []

    def backtrack(index):
        if index == len(s):
            result.append(subset[:])
            return
        subset.append(s[index])
        backtrack(index + 1)
        subset.pop()
        backtrack(index + 1)
        
    backtrack(0)
    return result
        
print(generate_subsets([1, 2, 3]))
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION