📜  统计-排列(1)

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

统计-排列

1. 统计

在编程中,统计可以指数值的计数(如出现的次数、平均数等)、时间的统计(如程序运行时间、延迟等)等。常见的统计算法有暴力枚举、哈希表、排序等。

1.1 暴力枚举

暴力枚举是最简单的统计算法,指针对所有元素逐一枚举,统计符合条件的元素个数,其时间复杂度为O(n)。但是对于大量数据则效率十分低下。

示例代码:

def count(arr, target):
    cnt = 0
    for i in range(len(arr)):
        if arr[i] == target:
            cnt += 1
    return cnt
1.2 哈希表

哈希表是一种高效的统计算法,其利用哈希函数将关键字映射为表中的一个位置,并把关键字存储在该位置上。哈希表的查询和修改时间复杂度仅为O(1)。但是哈希表的空间开销较大,在数据量较小的情况下并不适用。

示例代码:

def count(arr, target):
    hash_map = {}
    for i in range(len(arr)):
        if arr[i] not in hash_map:
            hash_map[arr[i]] = 1
        else:
            hash_map[arr[i]] += 1
    if target in hash_map:
        return hash_map[target]
    else:
        return 0
1.3 排序

排序是一种经典的统计算法,其将元素按照顺序排列后,再逐一统计符合条件的元素个数。

示例代码:

def count(arr, target):
    arr.sort()
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            break
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    if arr[mid] != target:
        return 0
    cnt = 1
    i = mid - 1
    while i >= 0 and arr[i] == target:
        cnt += 1
        i -= 1
    i = mid + 1
    while i < len(arr) and arr[i] == target:
        cnt += 1
        i += 1
    return cnt
2. 排列

排列是指对一组元素进行重新排列,得到不同的序列。在编程中,排列常用于密码破解、人工智能训练等领域。常见的排列算法有全排列、字典序排列等。

2.1 全排列

全排列是指对一组元素进行任意排列,其排列方式共有n!种,其时间复杂度为O(n!)。其实现代码较为简单,但是需要注意空间复杂度的问题。

示例代码:

def permutation(arr):
    def dfs(arr, path, res):
        if not arr:
            res.append(path)
        for i in range(len(arr)):
            dfs(arr[:i] + arr[i+1:], path + [arr[i]], res)
    res = []
    dfs(arr, [], res)
    return res
2.2 字典序排列

字典序排列是指对一组元素排列,按照字典序顺序进行排列,其时间复杂度为O(nlogn)。但是其实现较为复杂。

示例代码:

def next_permutation(arr):
    i, j = len(arr) - 2, len(arr) - 1
    while i >= 0 and arr[i] >= arr[i + 1]:
        i -= 1
    if i == -1:
        return []
    while arr[j] <= arr[i]:
        j -= 1
    arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1:] = reversed(arr[i + 1:])
    return arr
参考资料
  1. 《算法竞赛入门经典》
  2. 《挑战程序设计竞赛》