算法入门题

77 阅读2分钟
1. 1->2->3->4->5->6->7, 一个长N的单向链表,如何实现取到倒数第K个元素
实现1、
就是通过两个指针p1,p2,首先让p1往前走k-1步,然后让p1,p2一起往前走,
当p1走到尾的时候,p2即为倒数第k个。总共走了n次。时间复杂度为O(n).

实现2、先遍历一遍链表,将存到数组,下标取 数组的N-K个元素,




时间复杂度时间复杂度和空间复杂度
顾名思义,时间复杂度,就是说算法在运行过程中所耗用的时间,而空间复杂度,
则是算法运行过程中所占用的空间(内存、硬盘等等)。

在算法中怎么去衡量【时间复杂度】、【空间复杂度】的复杂级别呢,这里有一个专业名词叫大O阶。
推导大O阶方法:
1、用常量1取代算法中的所有加减法操作。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在的不是1,则去除与这个项相乘的参数。


例子
int sum = 0, n = 100;    /*执行一次*/
sum =  (1+ n)*n/2;        /*执行一次*/
printf("%d", sum);        /*执行一次*/
根据推导大O阶方法:
1、上面运行的次数3,用常量1表示。
2、没有最高阶


例子:
int count = 1;
while (count < n)
{
    count = count * 2;
}
每次乘以2后,距离n就近了一点,也就是 有多少个2相乘 大于n.则退出循环
x= long2 n  所以时间复杂度 O(log n)
在这段程序中,会运行n/2次。
根据推导大O阶方法:
1、上面运行的次数n/2,不是常量。
2、最高阶,X=log2n。




再如下面平方阶的例子
int j, j;
for (i = 0; i < n ; i++ ){
     for (j = 0; j <n ; j++  ){
        
    }
}
两次n的循环
一共循环 n x n 次
根据推导大O阶方法:
1、上面运行的次数n x n,不是常量。
2、最高阶,X=n2。 n的平方

再看例子


根据推导大O阶方法:
这里要看我最后一个红框内容,他用到了推导方法中的第三点,如果最高阶项存在的不是1,则去除与这个项相乘的参数。
所以最终大O阶为:O(n2)

常见时间复杂度:
执行次数       阶           非正式术语
12            O(1)         常数阶
2n+3          O(n)         线性阶3n2 + 2n+1    O(n2)        平方阶
。。。logn对数阶  nlogn阶    n3 立方阶    2n  指数阶