javascript将算法复杂度从O(n^2)做到O(n)
compare the difference of two giving array, return results: 1. elements in both array, 2. elements only in one array.
// O(m*n + m*n) -> O(2*m*n) -> O(n^2)
function compareArr1(arr1, arr2){
Array.prototype.contains = function(v) {
for (var i = this.length - 1; i >= 0; i--) {
if (this[i] == v) {
return 1;
}
}
return 0;
}
arr1 = arr1.sort();
arr2 = arr2.sort();
var ein12 = [], ein1 = [], ein2 = [];
for (var i = arr1.length - 1; i >= 0; i--) {
if(arr2.contains(arr1[i])){
ein12.push(arr1[i]);
}else{
ein1.push(arr1[i]);
}
}
for (var i = arr2.length - 1; i >= 0; i--) {
if(!arr1.contains(arr2[i])){
ein2.push(arr2[i]);
}
}
return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 }
}
// a=[1,2,3,2,3];
// b=[2,3,4,3,4];
// compareArr1(a,b);
// O(m*n + m + n) -> O(n^2)
function compareArr2(arr1, arr2) {
function delDup(arr) {
for (var i = arr.length - 1; i >= 1; i--) {
if(arr[i]==arr[i-1]){
arr.splice(i,1);
}
}
}
arr1 = arr1.sort();
arr2 = arr2.sort();
delDup(arr1);
delDup(arr2);
var ein12 = [], ein1 = arr1.slice(0, arr1.length), ein2 = arr2.slice(0, arr2.length);
for (var i = arr1.length - 1; i >= 0; i--) {
for (var j = arr2.length - 1; j >= 0; j--) {
if (arr1[i] == arr2[j]) {
ein12.push(arr1[i]);
ein1.splice(i, 1);
ein2.splice(j, 1);
break;
}
}
}
return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 }
}
// a=[1,2,3,2,3];
// b=[2,3,4,3,4];
// compareArr2(a,b);
// O(2m+2n+m+n) -> O(3(m+n)) -> O(n)
function compareArr3(arr1, arr2){
function arr2obj(obj,arr) {
for (var i = arr.length - 1; i >= 0; i--) {
obj['_' + arr[i]]=arr[i];
}
return obj;
}
var obj12 = {}, obj1 = {}, obj2 = {};
arr2obj(obj1,arr1);
arr2obj(obj2,arr2);
arr2obj(obj12,arr1);
arr2obj(obj12,arr2);
var ein12 = [], ein1 = [], ein2 = [];
for(var k in obj12){
if(obj1[k] && obj2[k])
{
ein12.push(obj12[k]);
}else if(obj1[k]){
ein1.push(obj12[k]);
}else{
ein2.push(obj12[k]);
}
}
return { 'ein12': ein12, 'ein1': ein1, 'ein2': ein2 }
}
// a=[1,2,3,2,3];
// b=[2,3,4,3,4];
// compareArr3(a,b);
Think more, and you can do better.
javascript将算法复杂度从O(n^2)做到O(n)的更多相关文章
- js算法初窥07(算法复杂度)
算法复杂度是我们来衡量一个算法执行效率的一个度量标准,算法复杂度通常主要有时间复杂度和空间复杂度两种.时间复杂度就是指算法代码在运行最终得到我们想要的结果时所消耗的时间,而空间复杂度则是指算法中用来存 ...
- .NET平台BigO算法复杂度备忘
之前一篇文章提到BIG O算法复杂度的备忘录, 今天这个是.NET 平台下集合类相关的Big O 算法复杂度 今天先到这儿,希望对您有参考作用, 您可能感兴趣的文章: 数据结构与算法 ...
- RX学习笔记:FreeCodeCamp的JavaScript基本算法挑战
FreeCodeCamp的JavaScript基本算法挑战 https://www.freecodecamp.com 2016-07-03 JavaScript还不是非常熟悉,用已经会的知识来解这些题 ...
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. 代码如下: #in ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...
- o(1), o(n), o(logn), o(nlogn)算法复杂度
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...
- FCC的javascript初级算法题解答
FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正 ...
- javascript 冒泡排序算法
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
随机推荐
- 浅析c++中virtual关键字
http://blog.csdn.net/djh512/article/details/8973606 1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定.要触发动态绑定, ...
- [Web 前端] 使用yarn代替npm作为node.js的模块管理器
cp from : https://www.jianshu.com/p/bfe96f89da0e Fast, reliable, and secure dependency managemen ...
- JAVA垃圾回收机制概要
垃圾回收是JAVA中的一个大知识点,也是一个著名知识点,毕竟JAVA号称自己先进性的时候总是会带上垃圾回收.于是,它也成了面试中的常客,面试官动不动的就要你解释下什么是垃圾回收,以及它的原理是什么.当 ...
- Java命令学习系列(四)——jstat
jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...
- 在Visual Studio 2013里使用 Microsoft SQL Server Compact Edition
(1)下载SQLCE组件 https://www.microsoft.com/en-us/download/details.aspx?id=17876 (2)下载VS2013工具设计器 https:/ ...
- godep使用
安装: 1.mac:brew Install godep,全局可用 2.go get -u -v github.com/tools/godep 参数-u表示更新,-v可以看到进度信息.成功安装后,在 ...
- git如何上传所有的新文件 gitlab如何上传所有的新文件 git本地覆盖服务器 强制本地覆盖服务器
原文地址: https://blog.csdn.net/qq_28093585/article/details/78749153 目的描述:新建的git项目,项目中有许多要从本地上传到git仓库的新 ...
- input type=file 选择图片并且实现预览效果的实例
为大家带来一篇input type=file 选择图片并且实现预览效果的实例. 通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型, ...
- Visual Studio提示“无法启动IIS Express Web服务器”的解决方法 vs调试显示无法显示此页面 ,vs调试浏览器白页
有时,在使用Visual Studio运行ASP.NET项目时,会提示“无法启动IIS Express Web服务器”,无法运行,如图: 这一般出现在重装系统之后,或者项目是从别的电脑上复制过来的.解 ...
- jboss支持远程访问配置
jboss有个特点,在本机启动之后,只能在本机的网页访问 http://localhost:8080,在其他机器上访问不了jboss服务. 1.关闭jboss服务端的防火墙 解决方法如下: (dcm4 ...