Comments (4)
from cv.
时间换空间以及空间换时间
两个数字进行交换
//时优 运用空间而减少了时间的使用
function swap(a, b) {
var c;
c = a;
a = b;
b = a;
}
//空优 运用时间而减少了空间的使用
function swap(a, b) {
a = a + b;
b = a - b;
a = a - b;
}
数组去重,也是一个典型的用空间换时间的例子
function unique(arr) {
var obj = {}
var result = []
for(var i in arr) {
if(!obj[arr[i]]) {
obj[arr[i]] = true;
result.push(arr[i]);
}
}
return result;
}
字符串中判断出现次数最多的那个字母,这个跟数组去重原理一样,用一个对象记录值得出现次数,然后再遍历对象寻找出现次数最大的那个字母
function findMaxDuplicateChar(str) {
// 记录字母出现次数
let charObj = {};
for (let i = 0; i < str.length; i++) {
if (!charObj[str[i]]) {
charObj[str[i]] = 1;
} else {
charObj[str[i]] += 1;
}
}
// 判断次数最多的字母
let maxChar = '',
maxValue = 1;
for (var k in charObj) {
if (charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar;
}
var str = 'afjghdfraaaasdenas';
var maxChar = findMaxDuplicateChar('afjghdfraaaasdenas');
from cv.
算法的效率
算法的效率主要由以下两个复杂度来评估:
复杂度 | 描述 |
---|---|
时间复杂度 | 评估执行程序所需的时间。可以估算出程序对处理器的使用程度 |
空间复杂度 | 评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度 |
常见的时间复杂度,按数量级递增排列依次为: |
下面引用算法(一)时间复杂度的图来表示各种时间复杂度
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n^2)
- 立方阶O(n^3)
- k次方阶O(n^k)
- 指数阶O(2^n)
推导大O阶技巧
推导大O阶,我们可以按照如下的规则来进行推导,得到的结果就是大O表示法,例如2 n ^ 2 + 3 n + 3
- 用常数1来取代运行时间中所有加法常数 //2 n ^ 2 + 3 n + 1
- 修改后的运行次数函数中,只保留最高阶项 //2 n ^ 2
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数。 //n ^ 2
常数阶
比如高斯算法,经典的1+2+3+...99+100的和
var sum = 0, n = 100; //执行一次
sum = (1 + n) * n / 2; //执行一次
console.log(sum); //执行一次
因为总共运行三次,这个算法的时间复杂度:O(3)
,但一般记作O(1)
下面我们看另外一个算法
var i, sum = 0, n = 100; //执行1次
for(i = 1; i <= n; i++) { //执行 n+1次
sum = sum + i; //执行n次
}
console.log(sum); //执行1次
这个跟上面不同的是中间用了一个for循环的方法,所以算法的执行次数为1 + ( n + 1 ) + n + 1 = 2n + 3
上述算法的执行总次数(所需时间)会随着 n 的增大而增加,但是在for循环以外的语句并不受n的规模影响(永远都只执行一次)。所以我们可以将上述算法的执行总次数简单的记做: 2n或者简记n
这样我们就得到了我们设计的算法的时间复杂度,我们把它记作:O(n)
从感官上我们就不难看出,从算法的效率上看,O(1)<O(n)
的,所以高斯的算法更快,更优秀。
线性阶
for(var i = 0; i < n; i++) {
//时间复杂度为O(1)的算法
...
}
上面算法循环体中的代码执行了n次,因此时间复杂度为O(n)
对数阶
对数阶时间复杂度会越来越小
var number = 1;
while(number < n) {
number = number * 2;
//时间复杂度为O(1)的算法
...
}
可以看出上面的代码,随着number每次乘以2后,都会越来越接近n,当number不小于n时就会退出循环。假设循环的次数为X,则由2^x=n
得出x=log₂n
,因此得出这个算法的时间复杂度为O(logn)
平方阶
for循环是要阶乘的
for(var i = 0; i < n; i++) { //执行 n+1次
for(var j = 0; j < n; i++) { //执行 n+1次
//复杂度为O(1)的算法
...
//执行 n次
}
}
时间复杂度如下( n + 1)(n + 1 + n) = 2 n ^ 2 + 3 n + 1
,因为只保留最高阶,所以系数和常数都被去掉,所以时间复杂度为O(n²)
参考文档
from cv.
from cv.
Related Issues (20)
- day2 HOT 10
- day3 HOT 5
- day4 HOT 5
- day4 HOT 4
- day6 HOT 8
- day12
- day13 HOT 2
- 正则表达式
- JavaScript工具函数大全(持续更新)
- JavaScript工具函数大全(持续更新) HOT 2
- 大厂面试题分享:如何让(a===1&&a===2&&a===3)的值为true? HOT 3
- 55 个提高你 CSS 开发效率的必备片段
- 继 NPM 被收购后,微软宣布推出 Github 口袋版!
- 给自己点时间再记记这200条Git命令 HOT 2
- 36个工作中常用的JavaScript函数片段
- try catch引发的性能优化深度思考
- 30 个极大提高开发效率的超级实用 VSCode 插件
- 大型前端项目如何实现 UI 可配置化
- 腾讯文档给 VSCode 贡献的 400 多行核心代码都干了什么
- 在腾讯这一年,坚守初心持续单纯 | 2021年终总结
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cv.