for (i = 0; i < 128; i++) { if (dic.charNode[i]->count > 0) // 对于出现过的字符,即Haffman树的叶子结点 { pMove = dic.charNode[i]; // 从叶子逆序到根,将编码逆序存放在tempCode中 while (pMove->parent) { if (pMove->parent->lchild == pMove) tempCode[count] = '0'; // 左子树为0 else tempCode[count] = '1'; // 右子树为1 count++; pMove = pMove->parent; } // 将tempCode编码逆序存放在字符结点中 for (j = 0; j < count; j++) dic.charNode[i]->code[j] = tempCode[count - j - 1]; dic.charNode[i]->code[j] = '\0'; count = 0; } }的时间复杂度是多少
时间: 2024-02-14 18:21:49 浏览: 117
这段代码的时间复杂度是 O(nlogn),其中 n 是字符集的大小。该段代码利用 Huffman 编码算法对每个出现过的字符进行编码,对于每个字符,需要从其对应的叶子结点开始,逆序遍历到根结点,将编码逆序存放在 tempCode 中,然后再将编码逆序存放在字符结点中。因为该算法构建了一个 Huffman 树,树的深度最多为 logn,而每个字符最多只需要遍历一次 Huffman 树,所以总体的时间复杂度是 O(nlogn)。
相关问题
/* 统计字符频率 */ int countChFrequency(FILE *fp) { int i; int length = 0; // 统计文本的长度 // 对dic进行初始化 for (i = 0; i < 128; i++) { dic.charNode[i] = (HaffmanTree)malloc(sizeof(HaffmanNode)); // 申请空间 dic.charNode[i]->character = i; // 将下标与 ASCII码对应 dic.charNode[i]->count = 0; dic.charNode[i]->lchild = NULL; dic.charNode[i]->rchild = NULL; dic.charNode[i]->parent = NULL; } // 对字符进行统计 char ch = fgetc(fp); while (ch != EOF) { dic.charNode[(int)ch]->count++; ch = fgetc(fp); length++; } return length; }的时间复杂度分析
这段代码的时间复杂度是 $O(n)$。其中,$n$ 表示文本的长度,即字符的数量。
代码中的循环只会遍历一遍文本,对每个字符在对应的节点中的计数器进行加一操作,因此时间复杂度与字符数量成正比,即为 $O(n)$。除此之外,代码中只有一些基本的赋值和指针操作,时间复杂度可以忽略不计。因此,整段代码的时间复杂度为 $O(n)$。
/* 构造Haffman树 */ HaffmanTree createHaffmanTree() { int i; // 由字典构造最小堆 Heap H = createHeap(MAXSIZE); for (i = 0; i < 128; i++) { if (dic.charNode[i]->count > 0) { insertMinHeap(H, dic.charNode[i]); } } // 构造Haffman树 while (H->size > 1) { // 创建新结点,值为两最小结点的和 HaffmanTree newNode = createHaffmanNode(); HaffmanTree left = deleteMinHeap(H); HaffmanTree right = deleteMinHeap(H); newNode->count = left->count + right->count; newNode->lchild = left; newNode->rchild = right; left->parent = newNode; right->parent = newNode; // 将新结点插入堆中 insertMinHeap(H, newNode); } HaffmanTree root = deleteMinHeap(H); return root; }时间复杂度为多少
该函数的时间复杂度为 $O(n \log n)$,其中 $n$ 是字典中不同字符的数量,因为该函数首先需要遍历字典,将所有出现次数大于0的字符节点插入到一个大小为 $n$ 的最小堆中,而插入一个节点的时间复杂度为 $O(\log n)$;然后,使用最小堆构造Haffman树,该过程需要将堆中的最小元素取出两次,创建一个新节点并赋值,最后将新节点插入堆中,这个过程需要重复 $n-1$ 次,因此时间复杂度为 $O(n\log n)$。因此,总时间复杂度为 $O(n\log n)$。
阅读全文