用牛顿插值法计算插值问题(+小实验 6) (大实验见 p316,实验 5 函数插值(2),要求用 MATLAB 和 C 语言完成) 【小实验 6】 问题描述 Huffman 树在编码中有着广泛的应用。在这里,我们只关心 Huffman 树的构造过 程。 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造 Huffman 树的过程如下: 1. 找到{pi}中最小的两个数,设为 pa 和 pb,将 pa 和 pb 从{pi}中删除掉,然后将 它们的和加入到{pi}中。这个过程的费用记为 pa + pb。 2. 重复步骤 1,直到{pi}中只剩下一个数。 在上面的操作过程中,把所有的费用相加,就得到了构造 Huffman 树的总费用。 本题任务:对于给定的一个数列,现在请你求出用该数列构造 Huffman 树的总费用。 例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman 树的构造过程如下: 1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是 2 和 3,从{pi}中删除它们并将和 5 加 入,得到{5, 8, 9, 5},费用为 5。 2. 找到{5, 8, 9, 5}中最小的两个数,分别是 5 和 5,从{pi}中删除它们并将和 10 加入, 得到{8, 9, 10},费用为 10。 3. 找到{8, 9, 10}中最小的两个数,分别是 8 和 9,从{pi}中删除它们并将和 17 加入, 得到{10, 17},费用为 17。 4. 找到{10, 17}中最小的两个数,分别是 10 和 17,从{pi}中删除它们并将和 27 加 入,得到{27},费用为 27。 5. 现在,数列中只剩下一个数 27,构造过程结束,总费用为 5+10+17+27=59。 输入格式 输入的第一行包含一个正整数 n(n<=100)。接下来是 n 个正整数,表示 p0, p1, …, pn1,每个数不超过 1000。 输出格式 输出用这些数构造 Huffman 树的总费用。 样例输入 5 5 3 8 2 9 样例输出 59
#include<stdio.h> void paixu(int a[], int n); int main() { int i, n, a[100], b[100], sum = 0; scanf_s("%d", &n); for (i = 0; i < n; i++) scanf_s("%d", &a[i]); paixu(a, n); for (i = 0; i < n - 1; i++) { sum += a[i] + a[i + 1]; a[i + 1] = a[i] + a[i + 1]; a[i] = 0; paixu(a, n); } printf("%d", sum); return 0; } void paixu(int a[], int n) { int i, j, temp; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (a[i] >= a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } } }
牛顿插值法利用差商的概念,在给定的数据点上构造一个多项式函数,使得这个函数在给定的数据点上取值等于所给的数据值。与拉格朗日插值法相比,牛顿插值法具有承袭性的优势,即在增加额外的插值点时,可以利用之前的运算结果以降低运算量。相比上一次实验,可以看出一般情况下牛顿插值法计算更简便,在计算量小的时候可以选择用其来解决问题 |
计算方法实验:用拉格朗日插值法计算插值问题
最新推荐文章于 2024-08-13 23:31:35 发布