时间空间复杂度分析:
牺牲时间换取空间,或者牺牲空间换取时间:
如果空间很大,可以用多线程来,可以大大提速
如果空间很小,只用一个元素,这样增加了时间
用 异或^ 不用借助中间变量就能实现数据的交换 a^=b
要完成两个数组之间的交换,用一个数组来作为临时中间变量进行交换时,可以用多线程,
相比只用一个数据来作为临时变量,大大加快了速度,多线程可以并行处理,
O(n)相比O(1)可以加快速度,O(1)相比O(n)可以节约空间,
用 异或 ^ a^=b 就是O(0)既节约时间又节约空间
异或交换:(*p1) ^= (*p2);
(*p2) ^= (*p1);
(*p1) ^= (*p2);
#include<iostream>
#include <time.h>
using namespace std;
//一般情况下看一个算法的时间就看循环,看空间就看节约了多少内存
void search(int *p,int n,int data)
{
for (int i = 0; i < n;i++)//循环次数统计时间
{
if (p[i]==data)
{
return;
}
}
}
void swap(int *p1,int *p2)
{
(*p1) ^= (*p2);
(*p2) ^= (*p1); /*用 异或 ^ a^=b 就是O(0)既节约时间又节约空间*/
(*p1) ^= (*p2);
{
int temp = *p1;
*p1 = *p2; //用中间变量速度会很慢 用时间换空间
*p2 = temp;
}
}
void main()
{
time_t ts;
unsigned int times = time(&ts);
srand(times);
int a[100];
for (int i = 0; i < 100;i++)
{
cout << (a[i] = rand()) << endl;
}
unsigned short data = 65535;
//data += 1;容错性,任何情况都可以处理
printf("飞哥有%d个", data);
cin.get();
}
索引的方式:
相比数组: 相比链式存储:
N个索引,M个元素 N个索引,M个元素
删除 顺序查找 二分查找 链表的查找 :O(M) 索引O(M/N)
数组 索引 数组 索引 数组 索引 链表的插入:O(1) 索引O(1)
O(M) O(M/N) O(M) O(M/N) 增加O(N) O(M/N) 链表的删除:0(1) 索引O(1)
链表的增加:O(1) 索引O(1)
最后给大家分享两道有点小变态的面试题:
1. int(*z(int x,int(*y)(int)))(int)
分析:
原型是:int(*T)(int)
int(*y)(int)=Y 函数指针
1可以简写为:Y z(int x,Y)
z是一个函数 它的参数是一个函数指针 返回值又是一个函数指针
2. int(*&z(int x,int(*&y)(int)))(int)
&z 函数指针的引用 它的参数是一个函数指针的引用 返回值是函数指针的引用