📅  最后修改于: 2023-12-03 15:27:36.933000             🧑  作者: Mango
在编程中,统计可以指数值的计数(如出现的次数、平均数等)、时间的统计(如程序运行时间、延迟等)等。常见的统计算法有暴力枚举、哈希表、排序等。
暴力枚举是最简单的统计算法,指针对所有元素逐一枚举,统计符合条件的元素个数,其时间复杂度为O(n)。但是对于大量数据则效率十分低下。
示例代码:
def count(arr, target):
cnt = 0
for i in range(len(arr)):
if arr[i] == target:
cnt += 1
return cnt
哈希表是一种高效的统计算法,其利用哈希函数将关键字映射为表中的一个位置,并把关键字存储在该位置上。哈希表的查询和修改时间复杂度仅为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
排序是一种经典的统计算法,其将元素按照顺序排列后,再逐一统计符合条件的元素个数。
示例代码:
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
排列是指对一组元素进行重新排列,得到不同的序列。在编程中,排列常用于密码破解、人工智能训练等领域。常见的排列算法有全排列、字典序排列等。
全排列是指对一组元素进行任意排列,其排列方式共有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
字典序排列是指对一组元素排列,按照字典序顺序进行排列,其时间复杂度为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