数据结构与算法基础-学习-34-基数排序(桶排序)

news2024/11/24 8:53:13

目录

一、基本思想

二、算法思路

1、个位排序

(1)分配

(2)收集

2、十分位排序

(1)分配

(2)收集

三、源码分享

1、InitMyBucket

2、DestroyMyBucket

3、ClearMyBucket

4、PushData2Bucket

5、PopDataFromBucket

6、GetIntegerDigit

7、BucketSortSentryQueue

四、算法效率

五、Linux环境编译测试


排序的其他相关知识点和源码分享可以参考之前的博客:   

《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》,

《数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序》,

《数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序》,

《数据结构与算法基础-学习-33-归并排序》

一、基本思想

基数排序的基本思想就是分配和收集。

基数排序也叫桶排序、箱排序,设置若干个桶,将关键字为k的记录放入第k个桶,然后再按照序号将非空的连接。

二、算法思路

我们还是以升序为例,初始化10个桶来存放数据,因为上面的数据最多到十分位,我们只需要两部就可以完成排序。

1、个位排序

(1)分配

10的个位是0,放到0号桶。

34的个位是4,放到4号桶。

1的个位是1,放到1号桶。

后面的数据以此类推。

(2)收集

我们按照顺序从第0个桶、第1个桶。。。。的顺序取数据,可以发现个位已经有序。并且只有个位的元素就不需要进行下一轮十分位的排序,我们只用比较有十分位的元素,这样可以减少排序时间。收集前桶中数据是全部,为了效率我们可以直接把只有个位的放入原序列中。

2、十分位排序

(1)分配

我们清空桶,将临时队列中的元素按照十分位的数值放入桶中。

(2)收集

我们按照顺序从第0个桶、第1个桶。。。。的顺序取数据,由于这些元素只有最大十分位,我们可以直接放入原队列中,这样就排好序啦。

三、源码分享

1、InitMyBucket

Status InitMyBucket(MyBucket** Bucket, QueueLenType BucketGroupNums, QueueLenType OneBucketNums, JudgeTypeFlag Flag)
{
    JudgeAllNullPointer(Bucket);

    if (BucketGroupNums * OneBucketNums > __LONG_LONG_MAX__)
    {
        LogFormat(Error,"Init Bucket Fail, Reason : BucketGroupNums(%lld) * OneBucketNums(%lld) > %lld.\n",
                  BucketGroupNums,OneBucketNums,__LONG_LONG_MAX__);
        return FailFlag;
    }

    QueueLenType i;

    (*Bucket)                       = (MyBucket*)MyMalloc(sizeof(MyBucket));
    (*Bucket)->BucketArrayMaxLen    = BucketGroupNums;
    (*Bucket)->BucketDataUseNums    = 0;
    (*Bucket)->BucketDataMaxUseNums = BucketGroupNums * OneBucketNums;
    (*Bucket)->BucketArray          = (SqQueue**)MyMalloc(BucketGroupNums * sizeof(SqQueue*));

    for ( i = 0; i < (*Bucket)->BucketArrayMaxLen; i++)
    {
        InitSqQueue(&((*Bucket)->BucketArray[i]),OneBucketNums,Flag);
    }
    
    LogFormat(Debug,"Init Bucket OK.\n");

    return SuccessFlag;
}

2、DestroyMyBucket

Status DestroyMyBucket(MyBucket** Bucket)
{
    JudgeAllNullPointer(*Bucket);

    QueueLenType i;

    for ( i = 0; i < (*Bucket)->BucketArrayMaxLen; i++)
    {
        DestroySqQueue(&((*Bucket)->BucketArray[i]));
    }

    free((*Bucket)->BucketArray);
    (*Bucket)->BucketArray          = NULL;
    (*Bucket)->BucketArrayMaxLen    = 0;
    (*Bucket)->BucketDataUseNums    = 0;
    (*Bucket)->BucketDataMaxUseNums = 0;
    free(*Bucket);
    *Bucket                         = NULL;
    
    LogFormat(Debug,"Destroy Bucket OK.\n");

    return SuccessFlag;
}

3、ClearMyBucket

Status ClearMyBucket(MyBucket* Bucket)
{
    JudgeAllNullPointer(Bucket);

    QueueLenType i;

    for ( i = 0; i < Bucket->BucketArrayMaxLen; i++)
    {
        ClearSqQueue(Bucket->BucketArray[i]);
    }
    Bucket->BucketDataUseNums = 0;

    LogFormat(Debug,"Clear Bucket OK.\n");

    return SuccessFlag;
}

4、PushData2Bucket

//将数据压入桶中。
Status PushData2Bucket(MyBucket* Bucket, QueueLenType BucketGroupIndex, void* Data)
{
    JudgeAllNullPointer(Bucket);
    JudgeAllNullPointer(Data);

    if (BucketGroupIndex < 0 || BucketGroupIndex >= Bucket->BucketArrayMaxLen)
    {
        LogFormat(Error,"Push Data To Bucket Fail, Reason : Illegal BucketGroupIndex(%lld).\n",BucketGroupIndex);
        return FailFlag;
    }

    if (Bucket->BucketDataUseNums == Bucket->BucketDataMaxUseNums)
    {
        LogFormat(Warning,"Push Data To Bucket Fail, Reason : Bucket Is Full(%lld).\n",Bucket->BucketDataMaxUseNums);
        return NormalFlag;
    }

    Status ReturnStatus;

    ReturnStatus = EnterSqQueue(Bucket->BucketArray[BucketGroupIndex],Data);
    if (ReturnStatus == SuccessFlag)
    {
        Bucket->BucketDataUseNums++;
        LogFormat(Debug,"Push Data To Bucket OK.\n");
    }
    
    return ReturnStatus;
}

5、PopDataFromBucket

//将数据从桶中取出来。
Status PopDataFromBucket(MyBucket* Bucket, QueueLenType BucketGroupIndex, void* Data)
{
    JudgeAllNullPointer(Bucket);
    JudgeAllNullPointer(Data);

    if (BucketGroupIndex < 0 || BucketGroupIndex >= Bucket->BucketArrayMaxLen)
    {
        LogFormat(Error,"Pop Data From Bucket Fail, Reason : Illegal BucketGroupIndex(%lld).\n",BucketGroupIndex);
        return FailFlag;
    }
    
    if (Bucket->BucketDataUseNums == 0)
    {
        LogFormat(Warning,"Pop Data From Bucket Fail, Reason : Bucket Is Empty.\n");
        return NormalFlag;
    }

    Status ReturnStatus;

    ReturnStatus = LeaveSqQueue(Bucket->BucketArray[BucketGroupIndex],Data);
    if (ReturnStatus == SuccessFlag)
    {
        Bucket->BucketDataUseNums--;
        LogFormat(Debug,"Pop Data From Bucket OK.\n");
    }

    return ReturnStatus;
}

6、GetIntegerDigit

//给出一个正整数,和你想要的位数,返回相应的位数。
//例如1234,你要十分位,返回一个3。
//1表示个位,2表示十分位,以此类推。 
//目前只支持int类型
int GetIntegerDigit(int Num, int Digit)
{
    // LogFormat(Debug,"Num : %d, Digit : %d\n",Num,Digit);
    if (Digit < 1 || Digit > 9)
    {
        return GET_INTEGER_DIGIT_FAIL_FLAG;
    }

    if (Num < 0)
    {
        return GET_INTEGER_DIGIT_FAIL_FLAG;
    }
    
    if (Digit == 1)
    {
        return Num % 10;
    }
    else if (MyIntSquare(10,Digit - 1) > Num)//如果Num不存在Digit相应的位数,如89不存在百分位的情况。
    {
        return GET_INTEGER_DIGIT_NO_EXISTS_FLAG;
    }
    else
    {
        return (Num % MyIntSquare(10,Digit) - Num % MyIntSquare(10,Digit - 1)) / MyIntSquare(10,Digit - 1);
    }
}

7、BucketSortSentryQueue

//由于GetIntegerDigit实现的原因,导致BucketSortSentryQueue只支持正整数排序。
//此函数如果执行出错,会改变Queue的值,里面存了中间结果。
Status BucketSortSentryQueue(SqQueue* Queue)
{
    JudgeAllNullPointer(Queue);

    MyBucket* Bucket   = NULL;
    SqQueue*  TmpQueue = NULL;//临时队列,存放中间数据。

    switch(Queue->Flag)
    {
        case INT_TYPE_FLAG  :
            InitMyBucket(&Bucket,INTEGER_BUCKET_NUMS,Queue->SqQueueLen,Queue->Flag);
            InitSqQueue(&TmpQueue,Queue->SqQueueLen,Queue->Flag);
            break;
        default :
            LogFormat(Error,"BucketSortSentry Function , Queue->Flag(%d) Is Unknow Type Flag, Exit!!!\n",Queue->Flag);
            exit(ExceptionExitFlag);
    }

    //后续再做成万能数据型
    //现在只支持整型
    int          ReutrnVal        = 0;
    QueueLenType i;
    QueueLenType BucketGroupIndex = 0;
    Status       ReturnStatus;
    int          Digit            = 1;//计算的位数
    QueueLenType MaxQueueLen      = Queue->SqQueueLen;

    do
    {
        if (Digit != 1)
        {
            //第n次收集是从TmpQueue读取数据,做整数Digit位的排序,放入桶中。
            for ( i = 0; i < TmpQueue->SqQueueLen; i++)
            {
                ReadSqQueue(TmpQueue,i,&ReutrnVal);
                BucketGroupIndex = GetIntegerDigit(ReutrnVal,Digit);
                PushData2Bucket(Bucket, BucketGroupIndex, &ReutrnVal);
            }
            //清理临时队列。
            ClearSqQueue(TmpQueue);
        }
        else
        {
            //第一次收集是从传入参数Queue读取数据,做整数个位的排序,放入桶中。
            for ( i = 1; i < Queue->SqQueueLen; i++)
            {
                ReadSqQueue(Queue,i,&ReutrnVal);
                BucketGroupIndex = GetIntegerDigit(ReutrnVal,Digit);
                PushData2Bucket(Bucket, BucketGroupIndex, &ReutrnVal);
            }

            ReadSqQueue(Queue,0,&ReutrnVal);
            ClearSqQueue(Queue);
            EnterSqQueue(Queue,&ReutrnVal);
        }

        //第n次分配,从桶中把顺序数据读取出来。
        i = 0;
        Digit++;
        while (Bucket->BucketDataUseNums != 0)
        {
            ReturnStatus = PopDataFromBucket(Bucket, i, &ReutrnVal);
            if (ReturnStatus == SuccessFlag)//成功读出数据,放入临时队列中。
            {
                if (GetIntegerDigit(ReutrnVal,Digit) == GET_INTEGER_DIGIT_NO_EXISTS_FLAG)//如果给的数没有Digit,放到最终队列中。
                {
                    EnterSqQueue(Queue,&ReutrnVal);
                }
                else if (GetIntegerDigit(ReutrnVal,Digit) != GET_INTEGER_DIGIT_FAIL_FLAG)//有Digit的进行下一步计算。
                {
                    EnterSqQueue(TmpQueue,&ReutrnVal);
                }
                else//异常情况
                {
                    LogFormat(Error,"Bucket Sort Sentry Queue Fail, Reason : Error Data(%d).\n",ReutrnVal);
                    exit(ExceptionExitFlag);
                }
            }
            else if (ReturnStatus == NormalFlag)//由于第i个桶的数据被读取完了,读下一个桶。
            {
                i++;
            }
            else//读取数据失败
            {
                DestroyMyBucket(&Bucket);
                DestroySqQueue(&TmpQueue);
                Bucket   = NULL;
                TmpQueue = NULL;
                LogFormat(Error,"Bucket Sort Sentry Queue Fail, Reason : Pop Data From Bucket Fail.\n");
                return FailFlag;
            }
        }
        //清理桶
        ClearMyBucket(Bucket);
    }while (GetSqQueueLen(Queue) < MaxQueueLen);//如果最终结果队列的元素个数小于Queue队列的元素个数,说明数据没有排序完。

    DestroyMyBucket(&Bucket);
    DestroySqQueue(&TmpQueue);
    Bucket   = NULL;
    TmpQueue = NULL;

    LogFormat(Debug,"Bucket Sort Sentry Queue OK.\n");

    return SuccessFlag;
}

四、算法效率

情况时间复杂度是否稳定
最好O(n + m)稳定
最坏O(k * (n + m))
平均O(k * (n + m))

例如我们上面这个计算时间复杂度是多少呢?

 (10个数字 + 10个桶)* 2位数 = 40

五、Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ time ./TestSort 
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,5 ,6 ,7 ,8 ,9 ,0 ,1 ,2 ,3 ,4 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init Bucket OK.
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear Bucket OK.
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy Bucket OK.
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Bucket Sort Sentry Queue OK.
2023-9-12--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-12--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-12--[ Debug ]--Destroy SqQueue OK

real    0m0.002s
user    0m0.002s
sys     0m0.000s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核分析与应用6-系统调用

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 6.1 Linux中的各种API LSB (Linux Standards Base) POSIX: 可移植操作系统接口(Portable Operating System Interface of UNIX) L…

如何用手机号注册亚马逊买家账号

注册亚马逊买家号可以用手机号&#xff0c;也可以用邮箱进行注册。想要用手机号注册买家号&#xff0c;那么打开相应的官网后填写手机号、设置密码、接收短信验证即可。 而如果想要批量注册亚马逊买家号&#xff0c;可以使用亚马逊鲲鹏系统进行操作&#xff0c;亚马逊鲲鹏系统也…

playwright自动化上传附件

需求 自动设置上传头像 过程 1. 首先保存本地一个文件&#xff0c;例如 aaa.php file_path files/aaa.png 2. 获取输入类型为 "file" 的按钮 file_input_element page.locator(input[typefile]) 3. 将本地保存的图片路径赋值 file_input_element.set_input_…

算法训练营day49|动态规划 part10:(LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II)

121. 买卖股票的最佳时机 题目链接&#x1f525; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大…

堆排序与TopK问题

一、堆排序 堆排序(升序)&#xff1a;堆排序的思想就是先用数组模拟建大堆&#xff0c;然后把根结点与最后一个结点值交换&#xff0c;最后一个结点的值就是最大值&#xff0c;然后再把前(n-1)个元素重新建大堆&#xff0c;然后根结点与最后一个结点值交换&#xff0c;就找出了…

javac不是内部或外部命令也不是可运行的程序如何解决?

小伙伴们你们有没有遇到过javac不是内部或外部命令,也不是可运行的程序这样的问题呢&#xff1f;大家遇到这样的问题不要慌&#xff0c;只要学会以下的操作你就可以轻松的解决了&#xff0c;具体的步骤操作就在下方&#xff0c;小伙伴们可以认真的看一看吧&#xff01; 1.首先…

cad文件如何转换成pdf?=

cad文件如何转换成pdf&#xff1f;在现代机械制造和建筑装饰领域中&#xff0c;CAD&#xff08;计算机辅助设计&#xff09;软件的应用非常普遍。然而&#xff0c;在与他人共享设计文件时&#xff0c;会发现cad文件的使用并不方便&#xff0c;首先它需要专用的软件才能将其打开…

webpack实战:某网站RSA登录加密逆向分析

文章目录 1. 写在前面2. 抓包分析3. 定位分析4. 构建webpack 1. 写在前面 回过头看&#xff0c;已慢慢将JS爬虫逆向类型的文章从0建设到了1&#xff0c;文章所有案例真实且内容有效&#xff0c;加密类型丰富。收获了很多粉丝的关注与支持&#xff0c;非常感谢大家&#xff01; …

奥康的高尔夫鞋,圈不住投资者的心

文 | 螳螂观察 作者 | 青月 鞋服行业终于熬过了“寒冬”&#xff0c;2023年行业景气度开始逐步回暖。 东方财富Choice数据显示&#xff0c;截至8月17日&#xff0c;已有28家鞋帽服装类上市公司发布了2023年中期业绩预告或快报&#xff0c;其中&#xff0c;9家预增&#xff0…

TCP的滑动窗口与拥塞控制

客户端每发送的一个包&#xff0c;服务器端都应该有个回复&#xff0c;如果服务器端超过一定的时间没有回复&#xff0c;客户端就会重新发送这个包&#xff0c;直到有回复。 为了保证顺序性&#xff0c;每一个包都有一个 ID。在建立连接的时候&#xff0c;会商定起始的 ID 是什…

Python 数据库——链表

基本概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表在逻辑上是连续的&#xff0c;但是在物理空间上可能是不连续的&#xff0c;因为链表的内存都是临时申请的&#xff0c;不一定会申请到连续的…

作物模型与遥感反演值同化建模的程序化实现

目录 专题一 遥感基础理论知识 专题二 作物长势监测与产量估算国内外研究进展 专题三 Fortran编程语言 专题四 作物参数遥感反演基本原理 专题五 PROSAIL模型 专题六 参数敏感性分析 专题七 遥感反演过程中的代价函数求解问题 专题八 基于查找表方法PROSAIL模型的作物参…

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮 效果图代码解析 效果图 代码解析 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons; import { useState, useEffect } from react; import { BASE_URL } from /utils/…

IOMesh 为 KubeVirt 提供高效稳定的持久化存储支持(附用户实践)

7 月 11 日&#xff0c;KubeVirt 社区正式宣布发布 Kubernetes 原生虚拟机管理插件 KubeVirt v1.0。这一版本发布不仅标志着 KubeVirt 已进化为生产就绪的虚拟机管理解决方案&#xff0c;也为正在使用虚拟化环境的用户提供了更多元的云化转型路线&#xff1a;搭配 Kubernetes 持…

vue3的params传参失效的解决方案state

vue3使用vue-router4.0&#xff0c;但是使用router.push的params传参&#xff0c;一直拿不到参数 查阅资料如下&#xff1a; —————————————————————————————————————————— state方案如下&#xff1a; 要传参的组件 import { u…

【C++模拟实现】手撕红黑树(含图解)

【C模拟实现】手撕红黑树&#xff08;含图解&#xff09; 目录 【C模拟实现】手撕红黑树&#xff08;含图解&#xff09;红黑树的介绍&#xff08;百度百科&#xff09;简介特征&#xff08;十分重要&#xff0c;红黑树的基础&#xff09; 红黑树的实现代码&#xff08;insert部…

运营商大数据合作方合作流程和具体服务流程是什么?

运营商大数据合作方合作的流程分为好几个阶段。首先是要进行合作咨询&#xff0c;咨询完成了以后&#xff0c;再直接对相关的数据进行相应的评估。接着再把资源整合起来&#xff0c;然后再对数据进行清洗&#xff0c;接着直接将产品进行包装&#xff0c;然后给数据定价&#xf…

Linux时区配置

Linux时区配置 timedatectl设置时区和时间启用自动同步NTP时间设置UTC或RTC时间查看UTC时间 查看所有可用时区查看当前时区设置系统时区启用夏令时timedatectl修改当前日期时间 通用设置时区方法使用tzselect设置时区 timedatectl设置时区和时间 timedatectl是一个系统工具&am…

解决微信小程序报错:“SyntaxError:Unexpected end of JSON input”

1. 报错原因&#xff1a; 如果对象的参数或数组的元素中遇到地址&#xff0c;地址中包括?、&这些特殊符号时&#xff0c;对象/数组先要通过JSON.stringify转化为字符串再通过encodeURIComponent编码&#xff1b;接收时&#xff0c;先通过decodeURIComponent解码再通过JSON…

成集云 | 聚水潭对接金蝶云星空接口 | 解决方案

源系统成集云目标系统 方案介绍 聚水潭是一款以SaaS ERP为核心&#xff0c;集多种商家服务为一体的SaaS协同平台&#xff0c;为全国35万多家电商企业提供全面的信息化解决方案。聚水潭已在全国设立了超过60个线下服务网点&#xff0c;服务范围覆盖超过300个城市&#xff0c;为…