分而治之 归并排序 二分搜索 动态规划 正统的斐波那契数 流水线调度问题 背包问题 最长公共子序列问题 贪婪算法 活动选择问题 霍夫曼编码问题
时间: 2024-06-01 21:10:35 浏览: 23
1. 分而治之:将一个大问题分解成多个小问题,逐个解决小问题,再将小问题的解合并起来得到大问题的解。
2. 归并排序:利用分而治之的思想,将一个无序的数组分成若干个小数组,然后将这些小数组逐个合并排序,最终得到有序的数组。
3. 二分搜索:利用分而治之的思想,将有序数组不断地分成两半,逐步缩小搜索范围,最终找到目标元素。
4. 动态规划:将一个大问题分解成多个小问题,利用小问题的解来求解大问题的解,通常用于求解最优解问题。
5. 正统的斐波那契数:斐波那契数列是指从0和1开始,后面每一项都是前面两项之和,正统的斐波那契数列将第一项定义为1,而不是0。
6. 流水线调度问题:将一个大的生产任务分解成多个小的任务,通过优化每个小任务的时间和资源分配来提高整个生产过程的效率。
7. 背包问题:有一个背包和一些物品,每个物品有自己的价值和重量,背包有一定的容量限制,如何选择物品能够使得背包中装入的物品价值最大化。
8. 最长公共子序列问题:给定两个字符串,找到它们的最长公共子序列,即在两个字符串中找到一个最长的子序列,使得这个子序列在两个字符串中完全相同。
9. 贪婪算法:在求解某些问题时,每一步都选择当前状态下最优的解决方案,从而达到全局最优化。
10. 活动选择问题:给定一些活动,每个活动有一个开始时间和结束时间,如何在不冲突的情况下选择最多的活动。
11. 霍夫曼编码问题:通过构建一颗哈夫曼树,将每个字符映射到一个唯一的二进制编码,从而实现数据压缩和传输。
相关问题
分别用暴力法、分而治之法、动态规划法求解最大子段和问题,使用c语言
暴力法:
```c
#include <stdio.h>
#include <stdlib.h>
int max_sub_array(int* nums, int nums_size) {
int max_sum = nums[0];
for (int i = 0; i < nums_size; i++) {
int cur_sum = nums[i];
for (int j = i + 1; j < nums_size; j++) {
cur_sum += nums[j];
if (cur_sum > max_sum) {
max_sum = cur_sum;
}
}
}
return max_sum;
}
int main() {
int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int nums_size = sizeof(nums) / sizeof(int);
int max_sum = max_sub_array(nums, nums_size);
printf("The maximum subarray sum is: %d\n", max_sum);
return 0;
}
```
分而治之法:
```c
#include <stdio.h>
#include <stdlib.h>
int max_sub_array(int* nums, int start, int end) {
if (start == end) {
return nums[start];
}
int mid = start + (end - start) / 2;
int left_max = max_sub_array(nums, start, mid);
int right_max = max_sub_array(nums, mid + 1, end);
int left_sum = nums[mid];
int max_left_sum = left_sum;
for (int i = mid - 1; i >= start; i--) {
left_sum += nums[i];
if (left_sum > max_left_sum) {
max_left_sum = left_sum;
}
}
int right_sum = nums[mid + 1];
int max_right_sum = right_sum;
for (int i = mid + 2; i <= end; i++) {
right_sum += nums[i];
if (right_sum > max_right_sum) {
max_right_sum = right_sum;
}
}
int cross_max = max_left_sum + max_right_sum;
int max_sum = left_max > right_max ? left_max : right_max;
max_sum = max_sum > cross_max ? max_sum : cross_max;
return max_sum;
}
int main() {
int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int nums_size = sizeof(nums) / sizeof(int);
int max_sum = max_sub_array(nums, 0, nums_size - 1);
printf("The maximum subarray sum is: %d\n", max_sum);
return 0;
}
```
动态规划法:
```c
#include <stdio.h>
#include <stdlib.h>
int max_sub_array(int* nums, int nums_size) {
int max_sum = nums[0];
int cur_sum = nums[0];
for (int i = 1; i < nums_size; i++) {
cur_sum = nums[i] > cur_sum + nums[i] ? nums[i] : cur_sum + nums[i];
max_sum = max_sum > cur_sum ? max_sum : cur_sum;
}
return max_sum;
}
int main() {
int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int nums_size = sizeof(nums) / sizeof(int);
int max_sum = max_sub_array(nums, nums_size);
printf("The maximum subarray sum is: %d\n", max_sum);
return 0;
}
```
注意:以上三个代码段均未进行错误处理和边界检查,仅供参考。
霍夫曼编码的分而治之算法求解过程分析
霍夫曼编码(Huffman Coding)是一种用于数据压缩的无损编码方法,它的基本思想是根据字符出现的频率赋予每个字符一个独一无二的编码,频率高的字符得到较短的编码,频率低的字符得到较长的编码。分而治之(Divide and Conquer)在这里的应用主要体现在构建霍夫曼树的过程。
**求解过程分析:**
1. **初始化**:收集字符及其出现频率,通常形成一个频率表。
2. **构建堆**:将频率表中的项目作为节点,构成一个空的优先级队列(或二叉堆),堆中元素按照频率从大到小排序。
3. **合并操作**:每次从堆顶取出两个频率最小的节点(也称为“最小权值”),将它们合并成一个新的节点,新节点的频率为两者之和,左子节点为原第一个节点,右子节点为第二个节点。然后将新节点放回堆中,继续进行。
4. **重复直至一节点**:当堆只剩下一个节点时,这个节点就是霍夫曼树的根节点,因为它代表了所有字符。剩下的路径即为每个字符的编码。
5. **编码生成**:从根节点开始,根据左右子节点的方向(左为0,右为1)生成编码。字符与其编码对应关系就形成了霍夫曼编码。
**相关问题--:**
1. 霍夫曼编码在数据压缩中的优势是什么?
2. 除了霍夫曼树,还有哪些常见的数据压缩算法?
3. 如何评估霍夫曼编码的实际压缩效果?
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)