第一次作业

此为本人交作业专用帖,如有不足欢迎探讨

  1. 证明以下公式成立

答:此题为时间复杂度的问题,在进行解答之前首先对时间复杂度进行解读:

当我们设计算法时,需要考虑算法执行所需的时间和空间资源。时间复杂度是衡量算法执行时间的一个重要指标,它描述的是随着输入规模的增大,算法执行时间的增长趋势。
在分析算法时间复杂度时,通常考虑最坏情况下算法的执行时间,即算法需要处理的输入最复杂的情况。下面介绍几种常见的时间复杂度:
常数时间复杂度 O(1):无论输入规模如何变化,算法的执行时间都是固定的常数,如数组访问。
线性时间复杂度 O(n):算法的执行时间与输入规模呈线性关系,当输入规模增大时,算法的执行时间也会线性增长,如数组遍历。
对数时间复杂度 O(log n):算法的执行时间随着输入规模呈对数增长,如二分查找。
平方时间复杂度 O(n^2):算法的执行时间随着输入规模的平方增长,如冒泡排序。
指数时间复杂度 O(2^n):算法的执行时间随着输入规模的指数级增长,如求解子集问题。
对数线性时间复杂度 O(n log n):算法的执行时间随着输入规模呈对数线性增长,如快速排序。
在实际应用中,我们通常需要选择时间复杂度较小的算法来解决问题,以保证算法的高效性。

(1)当n无限大时,n的一次方可以忽略不计,因此原式左边变成了10,而我们知道在时间复杂度的计算中常数是可以忽略不计的,所以10可以看作。此时(1)得证。

(2)可以写成×2.我们知道在计算时间复杂度时常数可以忽略不计,因此可以视之为

2. 一个字符串采用 string 对象存储,设计一个算法判断该字符串是否为回文

算法:

主体思路为利用双指针,一前一后逐次比对来判定是否为回文序列。

bool isPalindrome(string str) {
    int left = 0;
    int right = str.length() - 1;

    while (left < right) {
        if (str[left] != str[right]) {
            return false;
        }
        left++;
        right--;
    }

    return true;
}

c语言代码:

#include <stdio.h>
#include <string.h>

bool is_palindrome(const char *s) {
    // 字符串为空或长度为 1 时,直接返回 true
    if (!s || strlen(s) == 1) {
        return true;
    }

    // 定义左右指针
    int left = 0;
    int right = strlen(s) - 1;

    // 循环比较字符
    while (left < right) {
        if (s[left] != s[right]) {
            return false;
        }
        left++;
        right--;
    }

    // 没有发现不相等的字符,说明是回文
    return true;
}

int main() {
    char s[] = "abcdcba";
    if (is_palindrome(s)) {
        printf("%s is a palindrome.\n", s);
    } else {
        printf("%s is not a palindrome.\n", s);
    }

    char t[] = "hello";
    if (is_palindrome(t)) {
        printf("%s is a palindrome.\n", t);
    } else {
        printf("%s is not a palindrome.\n", t);
    }

    return 0;
}

VC6.0代码运行结果:

3.有一个整数序列,所有元素均不相同,设计一个算法求相差最小的元素对的个数。如序列 4、1、2、3 的相差最小的元素对的个数是 3,其元素对是(1,2),(2,3),(3,4)

算法:

def FindminPairs(nums):
    n = len(nums)
    min_diff = float('inf')#此为最小差值,初始值为正负无穷小
    nums.sort()#sort内置函数进行从大到小排序
    count = 0#用来统计计数最小对数的个数
    for i in range(1, n):
        diff = nums[i] - nums[i-1]#定义diff为某个数减去其前一个数的差值
        if diff < min_diff:
            min_diff = diff
            count = 1
        elif diff == min_diff:
            count += 1
    return count

该算法使用Python的内置排序函数(sort)来排序整数序列,然后使用一个循环来遍历排序后的序列,并统计相差最小的元素对的个数。在循环中,我们使用两个指针分别指向相邻的元素,计算它们之间的差值,如果差值小于当前最小差值,则更新最小差值,并将计数器重置为1,否则如果差值等于当前最小差值,则将计数器加1。最后返回计数器的值即可。

python代码:

def FindmindPairs(nums):
    n = len(nums)
    nums.sort()#sort内置函数进行从大到小排序
    min_diff = float('inf')#此为最小差值,初始值为正负无穷小
    count = 0#用来统计计数最小对数的个数
    for i in range(1, n):
        diff = nums[i] - nums[i-1]#定义diff为某个数减去其前一个数的差值
        if diff < min_diff:
            min_diff = diff
            count = 1
        elif diff == min_diff:
            count += 1
    return count

if __name__ == '__main__':
    nums = [4, 1, 2, 3]
    count = FindmindPairs(nums)
    print(count)

运行结果:

第三题拓展:

我是借助了python的排序功能(sort)函数,节省了一部分编码。实际上的主体部分也可以用c语言实现,只不过要把排序这里的代码展开写。下面是冒泡排序的代码

void bubble_sort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j+1]) {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值