哈夫曼编码/译码器

2023-05-16

哈夫曼编码/译码器

题目

哈夫曼编码/译码器。利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。

需求

(1)初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)编码(Encoding)。利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。
(5)打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

测试数据

(1)已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,以此设计哈夫曼编码。利用此数据对程序进行调试。
(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
在这里插入图片描述

程序设计流程图

在这里插入图片描述

程序源代码

#pragma warning(disable:4996)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define maxsize 100
#define N 100 //叶子结点最大个数
#define M 2*N-1 //所有结点的最大值
typedef struct Node
{
    int L_child;
    int R_child;
    int weight;//结点的权值
    int parent;//双亲下标
    char ch;
}Node, HuffmanTree[M + 1];
typedef char* HuffmanCode[N + 1];
FILE* fp1;//从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
FILE* fp2;//ToBeTran中的正文
FILE* fp3;//哈夫曼编码结果存在CodeFile中。
FILE* fp4;//译码结果存入文件TextFile中
FILE* fp5;//字符形式的编码
FILE* fp6;// =fopen("D:\\123.txt", "w");//字符形式的哈夫曼树写入文件TreePrint中
 
void select(HuffmanTree huffmanTree, int n, int* s1, int* s2)
{
    int i = 0;
    int min;//记录最小权值       
    for (i = 1; i <= n; i++)
    {
        if (huffmanTree[i].parent == 0)//如果此结点的没有父亲,那么把结点号赋值给 min,跳出循环
        {
            min = i;
            break;
        }
    }
    for (i = 1; i <= n; i++)
    {
        if (huffmanTree[i].parent == 0)//如果此结点的父亲为空,则进入 if
        {
            if (huffmanTree[i].weight < huffmanTree[min].weight)//如果此结点的权值比 min 结点的权值小,那么更新 min 结点,否则就是最开始的 min
                min = i;
        }
    }
    *s1 = min;//找到了最小权值的结点,s1指向

    for (i = 1; i <= n; i++)//遍历全部结点
    {
        if (huffmanTree[i].parent == 0 && i != (*s1))//找出下一个单节点,且没有被 s1指向,那么i 赋值给 min,跳出循环
        {
            min = i;
            break;
        }
    }
    for (i = 1; i <= n; i++)//继续遍历全部结点,找到权值最小的那一个
    {
        if (huffmanTree[i].parent == 0 && i != (*s1))
        {
            if (huffmanTree[i].weight < huffmanTree[min].weight)//如果此结点的权值比 min 结点的权值小,那么更新 min 结点,否则就是最开始的 min
                min = i;
        }
    }
    *s2 = min;//s2指针指向第二个权值最小的叶子结点
}
void CrtHuffmanTree(HuffmanTree  HuffTree, int n)//创建哈夫曼树
{
    int i, m, j;
    int s1, s2;
    printf("请输入字符及对应权值:\n");
    //memset("D:\\hfmTree.txt", 0, sizeof("D:\\hfmTree.txt"));
   // sprintf("D:\\hfmTree.txt", "D:\\hfmTree.txt");//写入你要打开的文件名
    fp1 = fopen("D:\\hfmTree.txt", "w");
    for (i = 1; i <= n; i++)
    {
        fflush(stdin);//清除缓存区
        scanf("%c%d", &HuffTree[i].ch, &HuffTree[i].weight);
        HuffTree[i].parent = 0;
        HuffTree[i].L_child = 0;
        HuffTree[i].R_child = 0;
        fprintf(fp1, "%c\t%d\n", HuffTree[i].ch, HuffTree[i].weight);
    }
    fclose(fp1);
    m = 2 * n - 1;
    for (i = n + 1; i <= m; i++)//非叶结点的初始化
    {
        HuffTree[i].L_child = 0;
        HuffTree[i].R_child = 0;
        HuffTree[i].weight = 0;
        HuffTree[i].parent = 0;
    }

    for (i = n + 1; i <= m; i++)
    {
        select(HuffTree, i - 1, &s1, &s2);
        HuffTree[i].weight = HuffTree[s1].weight + HuffTree[s2].weight;
        HuffTree[s1].parent = i;
        HuffTree[s2].parent = i;
        HuffTree[i].L_child = s1;
        HuffTree[i].R_child = s2;
    }
    printf("建立完成后:\n");
    for (i = 1; i <= n; i++)
    {
        printf("%c\t%d\n", HuffTree[i].ch, HuffTree[i].weight);
    }
}
int ReadFile(HuffmanTree HuffTree, int n)
{
    char ch;
    int i, m, j,head=n;
    int s1, s2;
    fp1 = fopen("D:\\hfmTree.txt", "r");
    for (i = 1; i <= n; i++)
    {
        fflush(stdin);//清除缓存区
        fscanf(fp1, "%c\t%d\n", &HuffTree[i].ch, &HuffTree[i].weight);         
        HuffTree[i].parent = 0;
        HuffTree[i].L_child = 0;
        HuffTree[i].R_child = 0;
    }
    fclose(fp1);
    m = 2 * n - 1;
    for (i = n + 1; i <= m; i++)//非叶结点的初始化
    {
        HuffTree[i].L_child = 0;
        HuffTree[i].R_child = 0;
        HuffTree[i].weight = 0;
        HuffTree[i].parent = 0;
        HuffTree[i].ch = '*';
    }
    for (i = n + 1; i <= m; i++)
    {
        select(HuffTree, i - 1, &s1, &s2);
        HuffTree[i].weight = HuffTree[s1].weight + HuffTree[s2].weight;
        HuffTree[s1].parent = i;
        HuffTree[s2].parent = i;
        HuffTree[i].L_child = s1;
        HuffTree[i].R_child = s2;
    }
    printf("建立完成后:\n");
    for (i = 1; i <= n; i++)
    {

        printf("%c\t%d\n", HuffTree[i].ch, HuffTree[i].weight);
    }     
    while (HuffTree[head].parent != 0  )
    {
        head++;
    }    
    printf("哈夫曼树的根节点为:%d\n", head);
    return head; 
}
void CrtHuffmanCode(HuffmanTree ht, HuffmanCode hc, int n)
{
    int start, i, c, p;
    char* cd;
    cd = (char*)malloc(n * sizeof(char));
    cd[n - 1] = '\0';
    for (i = 1; i <= n; i++)
    {
        start = n - 1;
        c = i;
        p = ht[i].parent;
        while (p != 0)
        {
            --start;
            if (ht[p].L_child == c)cd[start] = '0';
            else cd[start] = '1';
            c = p;
            p = ht[p].parent;
        }
        hc[i] = (char*)malloc((n - start) * sizeof(char));
        strcpy(hc[i], &cd[start]);
    }
    free(cd);
    printf("编码为:\n");
    for (i = 1; i <= n; i++)
    {
         
        printf("%c\t%s\n", ht[i].ch, hc[i]);

    }
}
void Queryman(char Midchar[1000], HuffmanTree ht, HuffmanCode hc, int m, int n)
{
    int i = 1, j = 1;
    char ch, Mid;
    fp3 = fopen("D:\\CodeFile.txt", "w");
    if (fp3 == NULL)printf("文件打开失败");
     
    while (i < m)
    {
        j = 1;
        ch = Midchar[i];  
     
        while (ch != ht[j].ch && j < n)
        {
            j++;
        }
        fprintf(fp3, "%s", hc[j]);
        i++;
    }
    rewind(fp3);
    fclose(fp3);
}
void Encoding(HuffmanTree ht, HuffmanCode hc, int n)
{
    int i = 0, m = 0;
    char Midchar[1000];
    char mid=0, ch;
    fp2 = fopen("D:\\ToBeTran.txt", "r");
    if (fp2 == NULL)printf("文件打开失败");
    else
    {
        while (!feof(fp2))
        {
            // if(ferror(fp2))clearerr(fp2);
            
            Midchar[i] = mid;
            m++;             
            printf("%c", Midchar[i]);
            i++; 
            mid = fgetc(fp2);
             
        }
        printf("\n");
        rewind(fp2);//将指针重新置于文件开头
        fclose(fp2); 
        Queryman(Midchar, ht, hc, m, n);
    }

}
void Printing()
{
    char m=0;
    int i = 0;
    fp3 = fopen("D:\\CodeFile.txt", "r");
    if (fp3 == NULL)printf("文件打开失败");
    else
    {
        fp5 = fopen("D:\\CodePrint.txt", "w");
        if (fp5 == NULL)printf("文件打开失败");
        else
        {      
            m = fgetc(fp3);
            while (!feof(fp3))
            {                              
                if (i == 50)
                {
                    printf("\n");
                    fprintf(fp5,"\n");
                    i = 0;
                }
                printf("%c", m);
                fprintf(fp5, "%c", m);
                i++;
                m = fgetc(fp3);
            }          
            rewind(fp5);
            fclose(fp5);
        }
        printf("\n");
        rewind(fp3);
        fclose(fp3);
    }
}void transcodehuffman(HuffmanTree HuffTree, int n, int head)
{
    int i = head;
    char mid,L,R;
    fp3 = fopen("D:\\CodeFile.txt", "r");
    if (fp3 == NULL)printf("文件打开失败");
    else
    {
        fp4 = fopen("D:\\TextFile.txt", "w");
        if (fp3 == NULL)printf("文件打开失败");
        else
        {
            printf("译码结果为:\n");
            while (!feof(fp3))
            {
                mid = fgetc(fp3);                
                if (mid == '0') i = HuffTree[i].L_child;  
                else i = HuffTree[i].R_child;
               if (HuffTree[i].L_child == 0 && HuffTree[i].R_child == 0)
                {                  
                    printf("%c", HuffTree[i].ch);
                    fprintf(fp4, "%c", HuffTree[i].ch);                   
                    i = head;                     
                }                
            }
        }
        rewind(fp4);
        fclose(fp4);
    }
    rewind(fp3);
    fclose(fp3);    
    printf("\n");
} 

int TreeDepth(HuffmanTree ht, int m)
{
    int hl, hr, max;
    if (ht[m].L_child != 0 || ht[m].R_child != 0)
    {
        hl = TreeDepth(ht, ht[m].L_child);
        hr = TreeDepth(ht, ht[m].R_child);
        max = hl > hr ? hl : hr;
        return(max + 1);
    }
    else return 0;
} 
void TreePrint(HuffmanTree HuffTree, int m, int nLayer)
{
    int i = 0;
   // fp6 = fopen("D:\\Tree Printing.txt", "w");
    if (fp6 == NULL)printf("文件打开失败");
    else
    {
        if (HuffTree[m].L_child == 0 || HuffTree[m].R_child == 0)
        {
            for (i = 0; i < nLayer; i++)
            {


                fprintf(fp6, "%s", "     ");
                printf("     ");
            }
            if (HuffTree[m].ch == 32)
            {
                fprintf(fp6, "%c\n", '#');
                printf("#\n");
            }
            else {
                fprintf(fp6, "%c\n", HuffTree[m].ch);
                printf("%c\n", HuffTree[m].ch);
            }
            return;
        }
        TreePrint(HuffTree, HuffTree[m].R_child, nLayer + 1);
        for (i = 0; i < nLayer; i++)
        {


            fprintf(fp6, "%s", "     ");
            printf("     ");
        }
        if (HuffTree[m].ch == '*')
        {
            fprintf(fp6, "%d\n", HuffTree[m].weight);
            printf("%d\n", HuffTree[m].weight);
        }
        else
        {
            if (HuffTree[m].ch == ' ')
            {
                fprintf(fp6, "%c\n", "*");
                printf("*\n");
            }
            fprintf(fp6, "%c\n", HuffTree[m].ch);
            printf("%c\n", HuffTree[m].ch);
        }

        TreePrint(HuffTree, HuffTree[m].L_child, nLayer + 1);
    }
}
void menu()
{
    printf("====================================================\n");
    printf("||                                                ||\n");
    printf("||                                                ||\n");
    printf("||            1.从终端读入字符及权值              ||\n");
    printf("||                                                ||\n");
    printf("||                                                ||\n");
    printf("||            2.从文件读入字符及权值              ||\n");
    printf("||                                                ||\n");
    printf("||                                                ||\n");
    printf("||            3.结束程序                          ||\n");
    printf("||                                                ||\n");
    printf("||                                                ||\n");
    printf("====================================================\n");
}
 
int main()
{
    int n;//字符集的大小  
    int head=0;//哈夫曼树根
    char ch;
    HuffmanTree HuffTree;
    HuffmanCode hc;  
    while (1)
    {
        menu();
        printf("请选哈夫曼树择构建方式:\n");
        fflush(stdin);//清除缓存区
        scanf("%d", &ch);
        switch (ch)
        {
        case 1:
        {
            printf("请输入字符集大小n:");
            scanf("%d", &n);
            CrtHuffmanTree(HuffTree, n);
            CrtHuffmanCode(HuffTree, hc, n);
            Encoding(HuffTree, hc, n);
            Printing();
            transcodehuffman(HuffTree, n, head);
            printf("\n%d\n", TreeDepth(HuffTree, head));
            TreePrint(HuffTree, head, TreeDepth(HuffTree, head));
            break;
        }
        case 2:
        {
            printf("请输入字符集大小n:");
            scanf("%d", &n);
            head = ReadFile(HuffTree, n);
            CrtHuffmanCode(HuffTree, hc, n);
            Encoding(HuffTree, hc, n);
            Printing();
            transcodehuffman(HuffTree, n, head);
            printf("\n%d\n", TreeDepth(HuffTree, head));             
            fp6=fopen("D:\\Tree Printing.txt", "w");
            TreePrint(HuffTree, head, TreeDepth(HuffTree, head));
            break;
        }
        case 3:
        {
            return 0;
            break;
        }
        default:
        {
            printf("输入不合法\n"); break;
        }
        }

    }
         
     
}

调试分析

a.问题分析与解决
(1)在调试时由于多次调用同一个文件并没有将指针复位,导致出现乱码。利用rewind( )函数可以将文件指针复位到文件开头,可以解决这个问题。
(2)当遇到需要读入字符且换行多次读取字符时,scanf( )函数会将换行符也读入,导致出现乱码。调用 库中的cin函数不仅可以自动吞掉换行符,而且可以不限输入格式。也可以在scanf( )函数后调用getchar( )函数来消除回车换行符。
(3)在使用fopen()函数时,一定要在写清文件的后缀,否则可能无法找到文件。
(4)在读取文件时,不可轻易使用rewind( )函数,否则读取文件数据时会把换行符也读入,导致读入错误而产生乱码。
b.算法的时空分析与改进设想
(1)在求解二叉树的深度时,我采用了后序遍历递归算法,在树的深度很大时其时空性能不高。可以通过建立一个显式栈来提高性能。
(2)本次采用的是静态链表构造的哈夫曼树,开辟的空间较大。个人认为利用动态链表构造哈夫曼树更能节省空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈夫曼编码/译码器 的相关文章

  • Anaconda安装教程及环境变量添加

    1 软件下载 1 1 点击Anaconda官网 xff0c 显示如下网页信息 1 2 点击下载 xff08 点击下载会自动识别你的计算机系统 xff0c 直接下载即可 xff09 右上角会提示具体下载信息 xff0c 等待下载完成 xff0
  • Arch的双显卡驱动

    Arch 的双显卡驱动 xorg 注意 xff1a 本文两种方案不可共存 xff01 xff01 optimus manager 方案 I卡驱动 不用装intel的驱动 xff0c 直接用mesa的就行 N卡驱动 编辑 pacman con
  • 现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1—5 小题(注意:每小题都要分别 写出关

    现有关系数据库如下 xff1a 学生 xff08 学号 xff0c 姓名 xff0c 性别 xff0c 专业 xff09 课程 xff08 课程号 xff0c 课程名 xff0c 学分 xff09 学习 xff08 学号 xff0c 课程号
  • LESS全面讲解

    一 基本介绍 1 1 css 预处理器的由来 相信前端开发人员对与CSS xff08 Cascading Style Sheet 级联样式表 xff09 这种 面向命名语言 xff0c 一定非常熟悉 你可能在某个舍友熟睡的深夜 xff0c
  • Cookie

    Cookie session的实现原理中 xff0c 每一个session对象会关联一个sessionid 例如 JSESSIONID 61 xxxxxxxxxxxxxx以上的这个键值对其实就是cookie对象这个cookie保存在浏览器的
  • 好用的跨平台开源截图工具推荐--flameshot

    flameshot 简介 flameshot 是一款跨平台的截图工具 图标 配置文件路经 linux config flameshot flameshot ini windows C Users YOURNAME AppData Roami
  • C语言 该日是该年的第几天(考虑闰年)

    给出日期 xff08 年月日 xff09 xff0c 计算该日是该年的第几天 xff08 需考虑是否是闰年 xff09 文章目录 前言一 逻辑演示部分 xff08 判断闰年 xff09 二 代码部分 1 代码示例2 输出演示总结 一 判断是
  • manila,barbican,cloudkitty服务的基本使用

    目录 Manila服务安装与使用Barbican服务安装与使用Cloudkitty服务安装与使用 Manila服务安装与使用 安装服务后创建default share type共享类型 不使用驱动程序支持 接着创建一个大小为2G的共享存储名
  • OpenCV计算机视觉(四) —— 图像的阈值处理与自适应阈值Otsu

    阈值处理是指剔除图像内像素高于阈值或者低于阈值的像素点 图像的阈值处理主要是设置一个阈值 xff1a 大于这个数赋予一个值 xff0c 小于一个数赋予另一个值 xff0c 将图片的像素值变成两个灰度值数中间的一个 xff0c 实现图像的分割
  • 基于C++ 的ASK数字通信系统仿真

    首先指明 xff1a 这是我大三时的一个课程设计 xff0c 希望对你有一定的指导意义 一 数字通信系统 在本次数字通信系统仿真中需要的课程基础主要有 xff1a 通信原理 xff0c 数字信号处理 xff0c C 43 43 语言程序设计
  • Hadoop集群配置

    伪分布集群安装 配置环境 linux系统 xff1a Centos7 虚拟机 xff1a VMware Workstation 16 Pro 一台Linux机器 xff0c 也可以称为是一个节点 xff0c 上面安装的有JDK环境 最上面的
  • 基本选择器

    jQuery基本选择器 span class token operator lt span script type span class token operator 61 span span class token string 34 t
  • 更改Windows的鼠标滚动方式为Mac方式(win鼠标滚轮反向)

    更改Windows的鼠标滚动方式为Mac方式 xff08 win鼠标滚轮反向 xff09 将Windows的滚动方向更改成和Mac一致的 自然 滚动 用习惯Mac系统偶尔用Windows xff0c 或者在Mac和Win之间倒腾来倒腾去的同
  • Java面试题

    Java面试题 并发面试题 集合面试题 一 Java基础 1 JDK和JRE有什么区别 JDK xff1a Java Development Kit 的简称 xff0c java 开发工具包 xff0c 提供了 java 的开发环境和运行环
  • VM虚拟机使用(文末有系统镜像)

    目录 前言 1 创建虚拟机 2 分盘操作 3 安装系统 4 备份 前言 本篇文章笔者详细述说了虚拟机的使用 xff0c 安装的是xp系统 xff0c 文末链接里面有xp与win7的系统镜像 若有问题 xff0c 希望大家斧正 xff08 手
  • linux必知必会-du命令

    du命令 du命令简介 du命令是linux系统里的文件大小查看的命令 du命令的应用场景十分广泛 xff1a 需要查看单个目录里面多个文件总大小 需要查看目录中每个文件的大小以及每个子文件夹中文件的大小 查看日志文件的大小 查看文件大小并
  • 解决在Ubuntu中设置了共享文件却找不到的原因

    可以看到我们在进入共享文件夹的时候 xff0c 并没有找到我们想要的文件 但文件夹里面是实实在在有文件的 解决方法 sudo vmhgfs fuse host mnt hgfs o nonempty o allow other 这个解决方法
  • python斐波那契数列

    基础python题 斐波那契数列 斐波那契数列指的是这样一个数列 xff1a 0 xff0c 1 1 xff0c 2 3 xff0c 5 8 xff0c 13 21 34 55 89 144 233 377 610 987 1597 题目分
  • python经典猴子偷桃

    猴子偷桃 题目 猴子吃桃问题 xff1a 猴子第一天摘下若干个桃子 xff0c 当即吃了一半 xff0c 还不瘾 xff0c 又多吃了一个第二天早上又将剩下的桃子吃掉一半 xff0c 又多吃了一个 以后每天早上都吃了前一天剩下的一半零一个
  • python分解质因数

    分解质因数 题目 题目 将一个整数分解质因数 例如 xff1a 输入90 打印出90 61 233 5 程序分析 根本不需要判断是否是质数 xff0c 从2开始向数本身遍历 xff0c 能整除的肯定是最小的质数 代码如下 target sp

随机推荐

  • C语言学习笔记——数组

    数组 eg xff1a 使用数组保存数据 使用数组保存用户输入的数据 当输入完毕后逆向输出数据 span class token macro property span class token directive keyword inclu
  • c语言基础——一维数组的应用

    C语言基础 一维数组的应用 例如 在一个学校的班级中会有很多学生 此时就可以使用数组来保存这些学生的姓名 以便进行管理 eg xff1a 用数组保存学生姓名 本示例每一个元素都应该是可以保存字符串的类型 这里使用字符指针类型 span cl
  • c-起泡法

    起泡法 这个算法的名字由来是因为越小的元素会经由交换慢慢 浮 到数列的顶端 xff08 升序或降序排列 xff09 xff0c 就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样 xff0c 故名 冒泡排序 比较相邻的元素 如果第一个比第二
  • c++字符串连接

    编写一个程序 xff0c 将两个字符串连接起来 xff0c 结果取代第一个字符串 要求用string方法 int main int a b cin gt gt a gt gt b sort a b cout lt lt a lt lt 34
  • 用new调用函数的四步走

    JS规定 xff0c 使用new调用函数会进行四步走 xff1a 1 函数体内会自动创建出一个空白对象 2 函数的上下文 xff08 this xff09 会自动指向这个对象 3 函数体内的语句会执行 4 函数会自动返回上下文对象 xff0
  • P1786 帮贡排序

    题目背景 在absi2011的帮派里 xff0c 死号偏多 现在absi2011和帮主等人联合决定 xff0c 要清除一些死号 xff0c 加进一些新号 xff0c 同时还要鼓励帮贡多的人 xff0c 对帮派进行一番休整 题目描述 目前帮派
  • vim如何提高效率:使用jk绑定Esc

    vim使用jk绑定Esc 为什么要使用jk绑定Esc vim的精华就在于几个基本的模式插入模式 底行模式 可视模式 xff0c 命令模式 正是因为这几个模式的存在让vim效率极高 虽然如此 xff0c 经常使用vim的人不难体会到从插入模式
  • Docker 安装mysql 解决中文乱码,数据持久化进入本地

    目录 一 xff1a 简单版的 xff08 没有持久化 xff0c 有乱码 xff0c 直接run 的容器实例 xff09 1 拉取镜像到本地 2 安装运行简单版 2 1 验证使用 xff0c 建库建表插入数据 2 2外部Win10也来连接
  • python中while语句

    一 while语句 1语法 xff1a while 条件 条件成立重复执行的代码1 条件成立重复执行的代码2 运用while语句需要注意 xff1a 1 初始值 2 跳出while的条件 3 计数器的变化 xff08 自增自减等等 xff0
  • SPSS数据分析

    第一题 表1 居民健康状况调查情况 编号 身高 xff08 cm xff09 体重 xff08 kg xff09 代谢综合征 性别 胆固醇 xff08 mmol L xff09 1 173 0 87 5 0 0 4 17 2 168 0 7
  • HA高可用集群文档搭建

    HA高可用集群文档搭建 准备工作 1 准备好三台虚拟机分别为hadoop01 hadoop02 hadoop03 创建安装包以及安装后的文档文件夹 span class token punctuation span root 64 hado
  • Python 计算机视觉(十三)—— 图像的傅里叶变换

    参考的一些文章以及论文我都会给大家分享出来 链接就贴在原文 xff0c 论文我上传到资源中去 xff0c 大家可以免费下载学习 xff0c 如果当天资源区找不到论文 xff0c 那就等等 xff0c 可能正在审核 xff0c 审核完后就可以
  • this的指向、工厂方法创建函数、构造函数

    一 this的指向 耐心看完 xff0c 这个彻底理解 xff0c 才不会成为一时的记忆 1 我们先来看函数的参数 xff1a function fn a b 形参 console log a b a 1 b 2 fn 1 2 实参 这没有
  • Minimum Sum ( 单调栈 )

    Minimum Sum xff08 AtCoder agc005 b xff09 Problem Statement One day Snuke was given a permutation of length N a1 a2 aN fr
  • F623光猫超级管理员密码获取

    中兴F623光猫超级管理员密码获取 事前说明 如果你不熟悉光猫的操作 xff0c 请勿修改或拆解任何与光猫有关的命令 零件 网线等 操作有风险 xff0c 运行需谨慎 光猫型号 xff1a ZXHN F623 所属运营商 xff1a 中国移
  • python制作字符动画

    字符动画从零制作 先展示一下效果吧 badapple 对动画有了解的人应该知道 xff0c 动画看起来是流畅的动作 xff0c 但其实是连续快速播放一张张图片 xff0c 欺骗眼睛达到的效果 xff0c 字符动画也是这样的原理 xff0c
  • 删除顺序表中相同元素

    删除顺序表中相同元素 题目 任意输入一长度为n的非递减数组 请设计算法删除其中的相同元素 方法 双指针判别 xff0c 具体看代码 xff1a span class token macro property span class token
  • 《Vim实用技巧(第2版)》学习笔记:技巧62-用寄存器中的内容替换高亮选区的内容

    技巧62 用寄存器中的内容替换高亮选区的内容 在可视模式下使用p命令时 xff0c Vim将用指定的寄存器内容来替换高亮选区中的文本 可以解决弄丢了复制内容的问题把删除和粘贴合成了一步 xff0c 不需要先删除高亮选区的内容再粘贴 无名寄存
  • 蓝桥杯 算法提高 最小字符串

    试题 算法提高 最小字符串 时间限制 xff1a 2 0s 内存限制 xff1a 256 0MB 问题描述 给定一些字符串 只包含小写字母 xff0c 要求将他们串起来构成一个字典序最小的字符串 输入格式 第一行T 表示有T组数据 接下来T
  • 哈夫曼编码/译码器

    哈夫曼编码 译码器 题目 哈夫曼编码 译码器 利用哈夫曼编码进行信息通信可以大大提高信道利用率 xff0c 缩短信息传输时间 xff0c 降低传输成本 但是 xff0c 这要求在发送端通过一个编码系统对待传数据预先编码 xff0c 在接收端