javascript集合求交集
两集合求交集
思路:
1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存。该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度。
2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M)。 这里,如果N 比 M 大,可以从A中取值,然后在B中判断是否有A的值,这样,复杂度为 O(M lg N)。
3. 利用hashtable. 先把A中的值存在hashtable里,然后对于每一个B中的值,判断是否在A中存在,因为hashtable查找的平均复杂度为 O(1), 所以,整个算法复杂度为O(N), 但是,这里的空间复杂度为 O(M) 。但是,这种方法适合数组比较小的情况。因为如果A数组比较大,hashtable会出现collision的情况,这样,查找的平均复杂度就不再是 O(1)。
方法1:
首先对2个数组排序,然后对arr1的元素都在arr2中进行二分查找。
刚开始写二分查找代码:
- function binarySearch(arr,key)
- {
- var low,high,mid;
- low=0;
- high=arr.length-1;
- while(low<=high)
- {
- mid=parseInt((low+high)/2);
- if(arr[mid]==key)
- {
- return mid;
- }
- else if(arr[mid]<key)
- {
- low=mid+1;
- }
- else
- {
- high=mid-1;
- }
- }
- return -1;
- }测试时var a=[1,2,3,5,7];
测试时var a=[1,2,3,5,7];
var result=binarySearch(a,7);
console.log(result)
3可以得到正确结果2,其他的都返回-1,为什么?调试时发现
如查找1时,
(0+4)/2=2;
a[2]=3>key; high=1;
mid=(0+1)/2 不为0,而是0.5;
导致错误。
原来2个数相除,要得到整数,必须用相关函数,使用parseInt还是Math.floor()参考:http://stackoverflow.com/questions/8170865/math-round-vs-parseint
http://zhidao.baidu.com/question/495738802.html
一个比较好的回答:
The two functions are really quite different.
parseInt()
extracts a number from a string, e.g.
parseInt('1.5')// => 1 返回一个number类型
Math.round()
rounds the number to the nearest whole number:
Math.round('1.5')// => 2 返回的是一个number类型。
parseInt()
can get its number by removing extra text, e.g.:
parseInt('12foo')// => 12
However, Math.round will not:
Math.round('12foo')// => NaN
Basically, you should probably use both since you're getting input from the user:
var number = parseInt(prompt('Enter number:'));var rounded =Math.round(number);
我们用Math.floor.改后的代码为:
- function binarySearch(arr,key)
- {
- var low,high,mid;
- low=0;
- high=arr.length-1;
- while(low<=high)
- {
- mid=Math.floor((low+high)/2);
- if(arr[mid]==key)
- {
- return mid;
- }
- else if(arr[mid]<key)
- {
- low=mid+1;
- }
- else
- {
- high=mid-1;
- }
- }
- return -1;
- }
如何对一个数组排序?
- arrayObject.sort(sortby)
我最开始写的代码为:
var b=[2,3,4,8,9,10];
for(var i=0;i<b.length;i++)
console.log(b[i]);
发现输出的是:10 2 3 4 8 9
为什么?以前没怎么用过sort函数。不清楚怎么回事.去w3cshool查了一下:
- arrayObject.sort(sortby)
参数 | 描述 |
---|---|
sortby | 可选。规定排序顺序。必须是函数。 |
返回值
对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
说明
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
当函数返回值为大于0的时候就交换两个数组项的顺序,否则就不交换。
- function desc(x,y)
- ...{
- if (x > y)
- return -1;
- if (x < y)
- return 1;
- }
- function asc(x,y)
- ...{
- if (x > y)
- return 1;
- if (x < y)
- return -1;
- }
- arrA.sort(desc); // sort by desc
- document.writeln(arrA);
- document.writeln("<br>");
- arrA.sort(asc); //sort by asc
- document.writeln(arrA);
- //输出结果:
- 6,5,4,3,2,1
- 1,2,3,4,5,6
这个恰好是与c++是相反的。
- 在本例中,我们将创建一个数组,并按字母顺序进行排序:
- <script type="text/javascript">
- var arr = new Array(6)
- arr[0] = "10"
- arr[1] = "5"
- arr[2] = "40"
- arr[3] = "25"
- arr[4] = "1000"
- arr[5] = "1"
- document.write(arr + "<br />")
- document.write(arr.sort())
- </script>
- 输出:
- 10,5,40,25,1000,1
- 1,10,1000,25,40,5
可以看到,不用参数,默认是按字典顺序排列的。我们的
- var b=[2,3,4,8,9,10];
虽然里面元素不是字符串,也是按照字符串对待按照字典顺序排列,所以出现了:
10 2 3 4 8 9 .
请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:
- function sortNumber(a,b)
- {
- return a - b
- }
- var arr = new Array(6)
- arr[0] = "10"
- arr[1] = "5"
- arr[2] = "40"
- arr[3] = "25"
- arr[4] = "1000"
- arr[5] = "1"
- document.write(arr + "<br />")
- document.write(arr.sort(sortNumber))
- </script>
- 输出:
- 10,5,40,25,1000,1
- 1,5,10,25,40,1000
以前还没注意到document.write可以直接输出一个array,这个很方便,要记住。
字符串的排序函数是:
- function sortNumber(a,b)
- {
- return a - b
- }
如何是数值也是一样的。- 完整求交集代码:
- function binarySearch(arr,key)
- {
- var low,high,mid;
- low=0;
- high=arr.length-1;
- while(low<=high)
- {
- mid=Math.floor((low+high)/2);
- if(arr[mid]==key)
- {
- return mid;
- }
- else if(arr[mid]<key)
- {
- low=mid+1;
- }
- else
- {
- high=mid-1;
- }
- }
- return -1;
- }
- var a=[1,2,3,5,7];
- var b=[2,3,4,8,9,10];
- function sortNumber(a,b)
- {
- return a-b;
- }
- a.sort(sortNumber);
- b.sort(sortNumber);
- for(var i=0;i<a.length;i++)
- {
- if(binarySearch(b,a[i]) != -1)
- console.log(a[i]);
- }
此复杂度为M*log2N.
方法2:
- for(var i=0,lenA=a.length,j=0,lenB=b.length;i<lenA&& j<lenB;)
- {
- if(a[i]==b[j])
- {
- document.write(a[i]+"<br/>");
- i++;
- j++;
- }
- else if(a[i]<b[j])
- {
- i++;
- }
- else
- {
- j++;
- }
- }
这个算法的排序后的复杂度M+N.(不算sort)。
附上: 常用的javascript集合操作: http://4umi.com/web/javascript/array.php
c++集合求交集,并集:
- #include <iostream>
- #include <algorithm>
- #include <iterator>
- #include <vector>
- using namespace std;
- void vectorJiaoJi(const vector<int>& v1,const vector<int>& v2,vector<int>& des)
- {
- int i=,j=;//定位2个有序向量的头部
- des.clear();
- while(i<v1.size()&&j<v2.size())
- {
- if(v1[i]<v2[j])
- i++;
- else if(v1[i]==v2[j])
- {
- des.push_back(v1[i]);
- i++;
- j++;
- }
- else
- j++;
- }
- }
- void vectorBingJi(const vector<int>& v1,const vector<int>& v2, vector<int>& des)
- {
- int i=,j=;
- des.clear();
- while(i<v1.size()&&j<v2.size())
- {
- if(v1[i]==v2[j])
- {
- des.push_back(v1[i]);
- i++;
- j++;
- }
- else if(v1[i]<v2[j])
- {
- des.push_back(v1[i]);
- i++;
- }
- else
- {
- des.push_back(v2[j]);
- j++;
- }
- }
- //对于部分未能压入vector元素,继续操作
- while(i<v1.size())
- {
- des.push_back(v1[i]);
- i++;
- }
- while(j<v2.size())
- {
- des.push_back(v2[j]);
- j++;
- }
- }
- int main()
- {
- vector<int> v1;
- vector<int> v2;
- vector<int> des;
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- sort(v1.begin(),v1.end());
- sort(v2.begin(),v2.end());
- vectorJiaoJi(v1,v2,des);
- int i=;
- while(i< des.size())
- {cout<<des[i]<<endl;i++;}
- cout<<endl;
- vectorBingJi(v1,v2,des);
- i=;
- while(i< des.size())
- {cout<<des[i]<<endl;i++;}
- cout<<endl;
- }
javascript集合求交集的更多相关文章
- 集合求交集 & 去除列表中重复的元素
集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...
- javascript 数组求交集/差集/并集/过滤重复
最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...
- 【转载】C#编程中两个List集合使用Intersect方法求交集
在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...
- list1与list2求交集的方法总结!
一.有序集合求交集的方法有 a)二重for循环法,时间复杂度O(n*n) b)拉链法,时间复杂度O(n) c)水平分桶,多线程并行 d)bitmap,大大提高运算并行度,时间复杂度O(n) e)跳表, ...
- Redis实现求交集操作结果缓存的设计方案
Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- C++求集合的交集差集
标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersection和std::set_union用来求两个集合的差集,交集和并集 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- 如何求ArrayList集合的交集 并集 差集 去重复并集
需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...
随机推荐
- LeakCanary,检测安卓,java内存泄漏
官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
- GoF——组合模式
组合模式:将对象组合成树形结构以表示“部分-真题”的结构层次.组合模式使得用户对单个对象和组合对象的使用具有一致性. 结构图: using System; using System.Collectio ...
- 学习iOS开发的前言
一.什么是iOS 要想学习iOS开发,首先要搞清楚什么是iOS.iOS其实是一款操作系统,就像平时我们在电脑上用的XP.Win7,都是操作系统. 那什么是操作系统呢?操作系统其实是一种软件,是直接运行 ...
- Oracle EBS-SQL (SYS-12):查询各Profile的设置情况.sql
SELECT pro.profile_option_name, pro.user_profile_option_name, lev.level_type TYPE, --lev.level_code, ...
- Delphi OleVariant 类型的用法
因客户需求,对客户的指纹机与公司产品进行集成,需要对指纹机做接口的二次开发,郁闷的是产商只提供了VB和C的DEMO示例,没有Delphi的,公司没有VB,C的环境,不能打开这二种语言的示例,因为本公司 ...
- IE9下报错,错误: “JSON”未定义
今天在公司运行的代码好好的,但是拿回家里以后就报错了 结果是IE9,没有设为兼容模式,唉,微软导出都是坑啊.
- Cocos2d-x CCNotificationCenter 通知中心
相信接触过ios开发的人来说对NSNotificationCenter都不陌生.而在cocos2d-x中也参照这个类,提供了CCNotificationCenter这个类,用作通知中心. 那么Noti ...
- [Leetcode][Python]23: Merge k Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...
- saiku导出excel单元格格式与中文列宽自动适应
在saiku导出excel后打开发现单元格的整数也显示为小数,并且含有中文的列宽没有自动适应,解决办法如下: 打开ExcelWorksheetBuilder.java文件,找到applyCellFor ...
- How To Set Dark Theme in Visual Studio 2010
Want to use the visual studio color theme editor to set the dark theme or other themes? Below shows ...