Stdboy 2020-01-02 11:53 采纳率: 0%
浏览 176

使用Golang在做PTA题目上容易超时

问题描述

我用Go写的算法,时间复杂度都已经降到了最低,但仍然不能通过PTA一些问题的大规模数据测试点,比如乙级测试题1028的第四个测试点,使用Go语言编写的代码就无法通过。
代码附在尾部。通过使用C语言改写算法,成功通过测试,C代码亦附在尾部。**我猜测可能会是Go fmt函数库运行效率比较慢,**不知道是不是这个原因,情各位大佬帮忙指点。

Go代码:

package main
import "fmt"
func main(){
    N,S := 0,0
    temp_year,max_year,min_year := 0,0,2015
    temp_month,max_month,min_month := 0,0,12
    temp_day,max_day,min_day := 0,0,12
    temp_name,max_name,min_name := "","",""
    fmt.Scanf("%d",&N)
    for i:=0;i<N;i++{
        fmt.Scanf("%s %d/%d/%d",&temp_name,&temp_year,&temp_month,&temp_day)
        if temp_year > 2014{
            continue
        }else if temp_year == 2014{
            if temp_month > 9{
                continue
            }else if temp_month == 9{
                if temp_day > 6{
                    continue
                }
            }
        }

        if 2014 - temp_year > 200{
            continue
        }else if  2014 - temp_year == 200{
            if temp_month < 9 {
                continue
            }else if temp_month == 9{
                if temp_day < 6{
                    continue
                }
            }
        }
        if temp_year>max_year{
            max_year = temp_year
            max_month= temp_month
            max_day = temp_day
            max_name = temp_name
        }else if temp_year == max_year{
            if temp_month > max_month{
                max_year = temp_year
                max_month= temp_month
                max_day = temp_day
                max_name = temp_name
            }else if temp_month == max_month{
                if temp_day > max_day{
                    max_year = temp_year
                    max_month= temp_month
                    max_day = temp_day
                    max_name = temp_name
                }
            }
        }
        if temp_year<min_year{
            min_year = temp_year
            min_month= temp_month
            min_day = temp_day
            min_name = temp_name
        }else if temp_year == min_year{
            if temp_month < min_month{
                min_year = temp_year
                min_month= temp_month
                min_day = temp_day
                min_name = temp_name
            }else if temp_month == min_month{
                if temp_day < min_day{
                    min_year = temp_year
                    min_month = temp_month
                    min_day = temp_day
                    min_name = temp_name
                }
            }
        }
        S++
    }
    if S == 0{
        fmt.Print("0")
    }else{
        fmt.Printf("%d %s %s",S,min_name,max_name)
    }
}

C代码:

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(){
    int N=0,S=0,i;
    int temp_year,max_year=0,min_year=2015;
    int temp_month,max_month=0,min_month = 12;
    int temp_day,max_day=0,min_day =31;
    char temp_name[6],max_name[6],min_name[6];
    scanf("%d",&N);
    for (i=0;i<N;i++){
        scanf("%s %d/%d/%d",&temp_name,&temp_year,&temp_month,&temp_day);
        if (temp_year > 2014){
            continue;
        }else if (temp_year == 2014){
            if (temp_month > 9){
                continue;
            }else if (temp_month == 9){
                if (temp_day > 6){
                    continue;
                }
            }
        }
        if (2014 - temp_year > 200){
            continue;
        }else if  (2014 - temp_year == 200){
            if (temp_month < 9) {
                continue;
            }else if (temp_month == 9){
                if (temp_day < 6){
                    continue;
                }
            }
        }
        if (temp_year>max_year){
            max_year = temp_year;
            max_month= temp_month;
            max_day = temp_day;
            memcpy(max_name,temp_name,strlen(temp_name)+1);
        }else if (temp_year == max_year){
            if (temp_month > max_month){
                max_year = temp_year;
                max_month= temp_month;
                max_day = temp_day;
                memcpy(max_name,temp_name,strlen(temp_name)+1);
            }else if (temp_month == max_month){
                if (temp_day > max_day){
                    max_year = temp_year;
                    max_month= temp_month;
                    max_day = temp_day;
                    memcpy(max_name,temp_name,strlen(temp_name)+1);
                }
            }
        }
        if (temp_year<min_year){
            min_year = temp_year;
            min_month= temp_month;
            min_day = temp_day;
            memcpy(min_name,temp_name,strlen(temp_name)+1);
        }else if (temp_year == min_year){
            if (temp_month < min_month){
                min_year = temp_year;
                min_month= temp_month;
                min_day = temp_day;
                memcpy(min_name,temp_name,strlen(temp_name)+1);
            }else if (temp_month == min_month){
                if (temp_day < min_day){
                    min_year = temp_year;
                    min_month = temp_month;
                    min_day = temp_day;
                    memcpy(min_name,temp_name,strlen(temp_name)+1);
                }
            }
        }
        S++;
    }
    if (S == 0){
        printf("0");
    }else{
        printf("%d %s %s",S,min_name,max_name);
    }

    return 0;
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-27 00:30
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    从你的 Go 代码来看,你已经尝试了各种可能的方法来优化和提高性能,例如:

    • 使用 if 条件语句检查年份、月份和日期是否满足特定条件。
    • 对于每个输入值,检查其是否大于给定的年份上限(即 2014 年)以及当前的最大值或最小值。
    • 在循环内部,直接计算最大值和最小值,而不是每次迭代都重新计算。

    然而,在大规模数据集上进行性能测试时,确实会遇到性能瓶颈。这可能是由于 Go 的 fmt 函数库运行速度较慢导致的。尽管如此,如果你能够找到更有效的算法或者改进现有算法以降低时间复杂度,那么通常情况下应该能够在 PTA 测试中取得更好的结果。

    此外,对于 C 语言代码,你可以考虑使用类似 std::vectorstd::map 这样的容器来存储数据,并且可以使用 std::sort 函数对数据进行排序,这样可以在 O(n log n) 时间内完成排序。这将有助于减少内存访问次数,从而提高性能。

    至于为什么 C 代码能成功通过测试,而 Go 代码却不行,可能是因为 Go 的某些特性使得性能不佳。例如,Go 的并发处理能力相对较弱,这对于大规模数据集上的性能优化来说是一个挑战。另外,Go 的垃圾回收机制可能不是最优选择,尤其是在内存压力较大的情况下。因此,使用其他编程语言(如 C++)可能提供更好的性能表现。

    总的来说,虽然 Go 的性能不如 C 程序,但在许多场景下,Go 是一个非常强大的语言,特别是在网络开发、异步编程和并发编程方面。如果你能在现有的 Go 代码基础上进一步优化,那么它仍然有可能在 PTA 测试中取得较好的成绩。

    评论

报告相同问题?