分治和递归

分治和递归

分治和递归不同,但常一起出现。

递归

递归:直接或间接调用自身的算法
解决问题: 全排列问题、整数划分问题


分治



解决问题:二分搜索、大整数乘法、棋盘覆盖、归并排序、快速排序、随机快速排序、线性时间选择(找出n个数中第k小的数)

分治法递归通常结合起来解决复杂的问题,其中寻找数组中的众数是一个常见的例子。众数是指在一个数据集中出现次数最多的元素。下面是一个使用Python实现的基于分治递归的解决方案: ```python def quickselect(arr, k): if len(arr) == 1: return arr[0] pivot_index = len(arr) // 2 pivot = arr[pivot_index] less = [x for x in arr if x < pivot] equal = [x for x in arr if x == pivot] greater = [x for x in arr if x > pivot] if k < len(equal): # 如果目标k小于等于中间值的数量,那么就是当前中间值 return pivot elif k < len(less) + len(equal): # 否则,在左侧子数组继续查找 return quickselect(less, k) else: # 在右侧子数组查找 return quickselect(greater, k - len(less) - len(equal)) def find_mode(arr): def count_elements(element): return arr.count(element) n = len(arr) mode_count = quickselect(sorted(set(arr)), n//2) # 取一半元素作为初始猜测的众数位置 max_count = count_elements(mode_count), mode_count for element in set(arr): current_count = count_elements(element) if current_count > max_count[0]: max_count = current_count, element return max_count[1] if max_count[0] > 1 else None # 返回出现最多次的那个数或None(如果都是单峰分布) # 示例 arr = [1, 1, 2, 2, 3, 4, 5, 5] print(find_mode(arr)) # 输出:5 ``` 在这个代码中,`quickselect`函数用于找出数组中第k小的元素,然后`find_mode`函数利用这个技巧找到众数。注意,这种方法假设众数存在且不会有多于`n/2`个的相同最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值