编程之美1.3 饼问题

使用gettickcount获取时间 测试效率

饼问题:

我的思路:

(1)选出最大饼

(2)起始饼到最大饼进行翻转

(3)最大饼在最上,再全部翻转,最大饼在最下面

(4)下一次从剩下饼中选出最大,loop


(我考虑的改进):

Developing1:

删除(3),每次从剩下饼中,找最大,loop

Developing2:

在Developing1基础上,对于(1),使用双指针找最大饼【或直接使用双向指针加速】


但是上述两种改进 并不符合题意。。。。



上述算法实现:

思路1:

    ///程序之美 1.3 算法实现///我的算法//
//为改进
    ///*
    //算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    //*/
    const int num = 50000;
    int cake[num];
    int cake1[num],cake2[num],cake3[num];

    srand(GetTickCount());
    for (int i = 0;i < num;i++)
    {
        cake[i] = rand();
        cake1[i] = cake[i];
        cake2[i] = cake[i];
        cake3[i] = cake[i];
    }

    int *pBegin,*pEnd;
    
    pBegin = &cake1[0];
    pEnd = &cake1[num - 1];
    const int *pOrigB = &cake1[0];
    const int *pOrigE = &cake1[num - 1];

    INT64 startTime = GetTickCount();

    while (pEnd != pOrigB)
    {
        int *pMax = pBegin;
        for (int *i = pBegin;i <= pEnd;i++)
        {
            if(*pMax < *i)
                pMax = i;
        }
        Reverse(pBegin,pMax);
        Reverse(pBegin,pEnd);                    //这个比较糟糕 翻转次数过多度 感觉
        pEnd--;
    }

    INT64 totalTime = (GetTickCount() - startTime);

    cout<<"The running time is:"<<totalTime<<endl;

    //for (int i = 0;i < num;i++)
        //printf(" %d ",cake1[i]);






Developing1:

/程序之美 1.3 算法实现///我的算法2 改进一下/其实并不符合题意 只是翻转速度更快/
//改进最后翻转过程。
    /*
    算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    */

    for (int i = 0;i < num;i++)
        cake2[i] = rand()%100;

    int *pBegin2,*pEnd2;
    
    pBegin2 = &cake2[0];
    pEnd2 = &cake2[num - 1];
    int *pOrigB2 = &cake2[0];
    int *pOrigE2 = &cake2[num - 1];

    INT64 startTime2 = GetTickCount();


    while (pBegin2 != pOrigE2)
    {
        int *pMax = pBegin2;
        for (int *i = pBegin2;i <= pEnd2;i++)
        {
            if(*pMax < *i)
                pMax = i;
        }
        Reverse(pBegin2,pMax);            //内部翻转
        pBegin2++;
    }
    Reverse(pOrigB2,pOrigE2);                //写到外面 实现大翻转 区别


    INT64 totalTime2 = (GetTickCount() - startTime2);

    

    cout<<"\n\nThe running time is:"<<totalTime2<<endl;

    //for (int i = 0;i < num;i++)
        //printf(" %d ",cake2[i]);


Developing2:

///程序之美 1.3 算法实现///我的算法//
//为改进
    ///*
    //算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    //*/

    int *pBegin,*pEnd;
    
    pBegin = &cake1[0];
    pEnd = &cake1[num - 1];
    const int *pOrigB = &cake1[0];
    const int *pOrigE = &cake1[num - 1];

    INT64 startTime = GetTickCount();
    int *pMax = NULL;

    while (pEnd != pOrigB)
    {
        int *pMax1 = pBegin;
        int *pMax2 = pEnd;
        for (int *i = pBegin,*j = pEnd;i <= j;i++,j--)//双指针 双向搜索最大值
        {
            if(*pMax1 < *i)
                pMax1 = i;
            if (*pMax2 < *j)
                pMax2 = j;
        }
        pMax = *pMax1<*pMax2?pMax2:pMax1;
        Reverse(pBegin,pMax);
        Reverse(pBegin,pEnd);                    //这个比较糟糕 翻转次数过多度 感觉
        pEnd--;
    }

    INT64 totalTime = (GetTickCount() - startTime);

    cout<<"The running time is:"<<totalTime<<endl;

    //for (int i = 0;i < num;i++)
        //printf(" %d ",cake1[i]);




微软实现:


汽车理论1.3是一门涉及汽车工程领域的理论课程,它包括了汽车工程的相关知识和技术。而Matlab编程是一种流行的科学计算软件,广泛用于工程和科学领域的数值计算和数据分析。 在汽车理论1.3中,Matlab编程可以应用于汽车工程的各个方面。例如,可以使用Matlab对汽车的动力系统进行建模和仿真。通过建立合适的数学模型,我们可以分析和预测汽车的性能和工况。同时,可以利用Matlab编程进行汽车的控制系统设计和优化。通过优化算法和控制策略的实现,可以提高汽车的燃油效率和驾驶性能。 此外,在汽车理论1.3中,Matlab编程可以用于汽车的结构分析和优化。通过建立合适的有限元模型,可以对汽车的结构进行静态和动态分析。在分析的基础上,可以利用Matlab编程进行结构的参数优化,以提高汽车的强度和刚度,并减轻车身的重量。 另外,Matlab编程还可以用于汽车的车载电子系统的设计与开发。通过编写Matlab程序,可以进行汽车的信号处理、数据采集和控制。例如,在电动汽车中,Matlab编程可以用于电池管理系统的设计和优化,以保持电池的性能和寿命。 总之,汽车理论1.3中的Matlab编程是一种重要的工具和技术,它能够帮助我们更好地理解和应用汽车工程的理论知识。通过Matlab编程实现汽车系统的建模、控制、优化和设计,可以提高汽车的性能、效率和可靠性,推动汽车工程的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值