此为本人交作业专用帖,如有不足欢迎探讨
证明以下公式成立
![](https://i-blog.csdnimg.cn/blog_migrate/717805b9e454b2ef30bf57892c401afc.png)
答:此题为时间复杂度的问题,在进行解答之前首先对时间复杂度进行解读:
当我们设计算法时,需要考虑算法执行所需的时间和空间资源。时间复杂度是衡量算法执行时间的一个重要指标,它描述的是随着输入规模的增大,算法执行时间的增长趋势。
在分析算法时间复杂度时,通常考虑最坏情况下算法的执行时间,即算法需要处理的输入最复杂的情况。下面介绍几种常见的时间复杂度:
常数时间复杂度 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代码运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8150aadbf4f573f0605b6a9368cb14bf.png)
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)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/57941ddc58304b049b3a02959c1897f9.png)
第三题拓展:
我是借助了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;
}
}
}
}