两集合求交集

思路:

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集合求交集的更多相关文章

  1. 集合求交集 & 去除列表中重复的元素

    集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...

  2. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...

  3. 【转载】C#编程中两个List集合使用Intersect方法求交集

    在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...

  4. list1与list2求交集的方法总结!

    一.有序集合求交集的方法有 a)二重for循环法,时间复杂度O(n*n) b)拉链法,时间复杂度O(n) c)水平分桶,多线程并行 d)bitmap,大大提高运算并行度,时间复杂度O(n) e)跳表, ...

  5. Redis实现求交集操作结果缓存的设计方案

    Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...

  6. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

  7. C++求集合的交集差集

    标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersection和std::set_union用来求两个集合的差集,交集和并集 ...

  8. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...

  9. 如何求ArrayList集合的交集 并集 差集 去重复并集

    需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...

随机推荐

  1. EC读书笔记系列之13:条款25 考虑写出一个不抛异常的swap函数

    记住: ★当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定其不抛出异常 ★若你提供一个member swap,也该提供一个non-member swap来调用前者.对于cla ...

  2. 不要伤害指针(1)--运算符&和*

    原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6646001 增加自己的想法,作为笔记. 这里&是取地址运算符,*是间接运算 ...

  3. CSS3盒模型display:-webkit-box;的使用

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没有得到 ...

  4. 《javascript dom编程艺术》笔记(二)——美术馆示例

    这几天把这本书看完了,里面大部分知识我已经会了,所以看得就略简单,好多地方都没有再去动手去做,我知道这样是不对的,以后补吧. 现在我要做的是把这本书的笔记完结掉,不然总觉得有啥事没有做. 这个版本不是 ...

  5. APP分享抓取网页图片

    var getShareImages = { defaultimg:"defaultimg.png", _allImgs:null, init:function(){ getSha ...

  6. SQL Server 行的删除与修改-------------(未完待续P222 deep SQL Server 222 )

    删除: 1.堆表:当行被删除时,不会自动重新组织页面上的空间.删除行时不会从物理页面上删除, 而只是把行偏移设置为 0 .表示空间没有使用.除了页面上没有被回收空间之外,堆中的 空白页也常常不会被回收 ...

  7. Linux宕机最安全的重启方法(你肯定不知道)

    Linux 内核虽然号称“不死族”,几乎不会崩溃或者死机,但是特殊情况下,还是有一定几率会宕机的.因为 Linux 广泛用于生产环境,所以每一次宕机都会引起相当大的损失.本文介绍在它死机至后,一种温柔 ...

  8. android 添加左右滑屏手势

    今天要在自己的项目中添加左右滑动,实现日期的加减(原来已经做了加减按键).滑动在一个中间的layout中进行 思路:添加左右划屏幕判断,得到判断后模拟加减按键按下. 模拟按键按下用 mbotton.p ...

  9. java实现二维码生成的几个方法

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  10. 今天起改用mac的marsedit写博

    最近一直使用mac来工作,所以写博也相应改为marsedit. 初步感觉还是不错的,越来越发现mac其实也适合在工作中使用,生活上当然不在话下. 从高富帅的x220t变成屌丝的macbook小白(升级 ...