两集合求交集

思路:

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中进行二分查找。

刚开始写二分查找代码:

  1. function binarySearch(arr,key)
  2. {
  3. var low,high,mid;
  4. low=0;
  5. high=arr.length-1;
  6. while(low<=high)
  7. {
  8. mid=parseInt((low+high)/2);
  9. if(arr[mid]==key)
  10. {
  11. return mid;
  12. }
  13. else if(arr[mid]<key)
  14. {
  15. low=mid+1;
  16. }
  17. else
  18. {
  19. high=mid-1;
  20. }
  21. }
  22. return -1;
  23. }测试时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.

  1. parseInt('1.5')// => 1 返回一个number类型

Math.round() rounds the number to the nearest whole number:

  1. Math.round('1.5')// => 2 返回的是一个number类型。

parseInt() can get its number by removing extra text, e.g.:

  1. parseInt('12foo')// => 12

However, Math.round will not:

  1. Math.round('12foo')// => NaN

Basically, you should probably use both since you're getting input from the user:

  1. var number = parseInt(prompt('Enter number:'));var rounded =Math.round(number);

我们用Math.floor.改后的代码为:

  1. function binarySearch(arr,key)
  2. {
  3. var low,high,mid;
  4. low=0;
  5. high=arr.length-1;
  6. while(low<=high)
  7. {
  8. mid=Math.floor((low+high)/2);
  9. if(arr[mid]==key)
  10. {
  11. return mid;
  12. }
  13. else if(arr[mid]<key)
  14. {
  15. low=mid+1;
  16. }
  17. else
  18. {
  19. high=mid-1;
  20. }
  21. }
  22. return -1;
  23. }

如何对一个数组排序?

  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查了一下:

  1. arrayObject.sort(sortby)
参数 描述
sortby 可选。规定排序顺序。必须是函数。

返回值

对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

说明

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

当函数返回值为大于0的时候就交换两个数组项的顺序,否则就不交换。

  1. function desc(x,y)
  2. ...{
  3. if (x > y)
  4. return -1;
  5. if (x < y)
  6. return 1;
  7. }
  8. function asc(x,y)
  9. ...{
  10. if (x > y)
  11. return 1;
  12. if (x < y)
  13. return -1;
  14. }
  15. arrA.sort(desc); // sort by desc
  16. document.writeln(arrA);
  17. document.writeln("<br>");
  18. arrA.sort(asc); //sort by asc
  19. document.writeln(arrA);
  20. //输出结果:
  21. 6,5,4,3,2,1
  22. 1,2,3,4,5,6

这个恰好是与c++是相反的。

  1. 在本例中,我们将创建一个数组,并按字母顺序进行排序:
  2. <script type="text/javascript">
  3.  
  4. var arr = new Array(6)
  5. arr[0] = "10"
  6. arr[1] = "5"
  7. arr[2] = "40"
  8. arr[3] = "25"
  9. arr[4] = "1000"
  10. arr[5] = "1"
  11.  
  12. document.write(arr + "<br />")
  13. document.write(arr.sort())
  14.  
  15. </script>
  16. 输出:
  17. 10,5,40,25,1000,1
  18. 1,10,1000,25,40,5

可以看到,不用参数,默认是按字典顺序排列的。我们的

  1. var b=[2,3,4,8,9,10];
    虽然里面元素不是字符串,也是按照字符串对待按照字典顺序排列,所以出现了:
    10 2 3 4 8 9 .
    请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:
  1. function sortNumber(a,b)
  2. {
  3. return a - b
  4. }
  5.  
  6. var arr = new Array(6)
  7. arr[0] = "10"
  8. arr[1] = "5"
  9. arr[2] = "40"
  10. arr[3] = "25"
  11. arr[4] = "1000"
  12. arr[5] = "1"
  13.  
  14. document.write(arr + "<br />")
  15. document.write(arr.sort(sortNumber))
  16.  
  17. </script>
  18. 输出:
  19. 10,5,40,25,1000,1
  20. 1,5,10,25,40,1000

以前还没注意到document.write可以直接输出一个array,这个很方便,要记住。

字符串的排序函数是:

  1. function sortNumber(a,b)
  2. {
  3. return a - b
  4. }
    如何是数值也是一样的。
  5.  
  6. 完整求交集代码:
  1. function binarySearch(arr,key)
  2. {
  3. var low,high,mid;
  4. low=0;
  5. high=arr.length-1;
  6. while(low<=high)
  7. {
  8. mid=Math.floor((low+high)/2);
  9. if(arr[mid]==key)
  10. {
  11. return mid;
  12. }
  13. else if(arr[mid]<key)
  14. {
  15. low=mid+1;
  16. }
  17. else
  18. {
  19. high=mid-1;
  20. }
  21. }
  22. return -1;
  23. }
  24.  
  25. var a=[1,2,3,5,7];
  26. var b=[2,3,4,8,9,10];
  27.  
  28. function sortNumber(a,b)
  29. {
  30. return a-b;
  31. }
  32.  
  33. a.sort(sortNumber);
  34. b.sort(sortNumber);
  35.  
  36. for(var i=0;i<a.length;i++)
  37. {
  38. if(binarySearch(b,a[i]) != -1)
  39. console.log(a[i]);
  40. }

此复杂度为M*log2N.

方法2:

  1. for(var i=0,lenA=a.length,j=0,lenB=b.length;i<lenA&& j<lenB;)
  2. {
  3. if(a[i]==b[j])
  4. {
  5. document.write(a[i]+"<br/>");
  6. i++;
  7. j++;
  8. }
  9. else if(a[i]<b[j])
  10. {
  11. i++;
  12. }
  13. else
  14. {
  15. j++;
  16. }
  17. }

这个算法的排序后的复杂度M+N.(不算sort)。

附上:  常用的javascript集合操作:  http://4umi.com/web/javascript/array.php

c++集合求交集,并集:

  1. #include <iostream>
  2.  
  3. #include <algorithm>
  4. #include <iterator>
  5.  
  6. #include <vector>
  7. using namespace std;
  8.  
  9. void vectorJiaoJi(const vector<int>& v1,const vector<int>& v2,vector<int>& des)
  10. {
  11. int i=,j=;//定位2个有序向量的头部
  12. des.clear();
  13. while(i<v1.size()&&j<v2.size())
  14. {
  15. if(v1[i]<v2[j])
  16. i++;
  17. else if(v1[i]==v2[j])
  18. {
  19. des.push_back(v1[i]);
  20. i++;
  21. j++;
  22. }
  23. else
  24. j++;
  25. }
  26. }
  27.  
  28. void vectorBingJi(const vector<int>& v1,const vector<int>& v2, vector<int>& des)
  29. {
  30. int i=,j=;
  31. des.clear();
  32. while(i<v1.size()&&j<v2.size())
  33. {
  34. if(v1[i]==v2[j])
  35. {
  36. des.push_back(v1[i]);
  37. i++;
  38. j++;
  39. }
  40. else if(v1[i]<v2[j])
  41. {
  42. des.push_back(v1[i]);
  43. i++;
  44. }
  45. else
  46. {
  47. des.push_back(v2[j]);
  48. j++;
  49. }
  50. }
  51.  
  52. //对于部分未能压入vector元素,继续操作
  53. while(i<v1.size())
  54. {
  55. des.push_back(v1[i]);
  56. i++;
  57. }
  58. while(j<v2.size())
  59. {
  60. des.push_back(v2[j]);
  61. j++;
  62. }
  63. }
  64. int main()
  65. {
  66.  
  67. vector<int> v1;
  68. vector<int> v2;
  69. vector<int> des;
  70.  
  71. v1.push_back();
  72. v1.push_back();
  73. v1.push_back();
  74. v1.push_back();
  75. v1.push_back();
  76. v1.push_back();
  77. v1.push_back();
  78.  
  79. v2.push_back();
  80. v2.push_back();
  81. v2.push_back();
  82. v2.push_back();
  83. v2.push_back();
  84. v2.push_back();
  85. v2.push_back();
  86.  
  87. sort(v1.begin(),v1.end());
  88. sort(v2.begin(),v2.end());
  89.  
  90. vectorJiaoJi(v1,v2,des);
  91. int i=;
  92. while(i< des.size())
  93. {cout<<des[i]<<endl;i++;}
  94. cout<<endl;
  95.  
  96. vectorBingJi(v1,v2,des);
  97. i=;
  98. while(i< des.size())
  99. {cout<<des[i]<<endl;i++;}
  100. cout<<endl;
  101. }

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. LeakCanary,检测安卓,java内存泄漏

    官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

  2. GoF——组合模式

    组合模式:将对象组合成树形结构以表示“部分-真题”的结构层次.组合模式使得用户对单个对象和组合对象的使用具有一致性. 结构图: using System; using System.Collectio ...

  3. 学习iOS开发的前言

    一.什么是iOS 要想学习iOS开发,首先要搞清楚什么是iOS.iOS其实是一款操作系统,就像平时我们在电脑上用的XP.Win7,都是操作系统. 那什么是操作系统呢?操作系统其实是一种软件,是直接运行 ...

  4. Oracle EBS-SQL (SYS-12):查询各Profile的设置情况.sql

    SELECT pro.profile_option_name, pro.user_profile_option_name, lev.level_type TYPE, --lev.level_code, ...

  5. Delphi OleVariant 类型的用法

    因客户需求,对客户的指纹机与公司产品进行集成,需要对指纹机做接口的二次开发,郁闷的是产商只提供了VB和C的DEMO示例,没有Delphi的,公司没有VB,C的环境,不能打开这二种语言的示例,因为本公司 ...

  6. IE9下报错,错误: “JSON”未定义

    今天在公司运行的代码好好的,但是拿回家里以后就报错了 结果是IE9,没有设为兼容模式,唉,微软导出都是坑啊.

  7. Cocos2d-x CCNotificationCenter 通知中心

    相信接触过ios开发的人来说对NSNotificationCenter都不陌生.而在cocos2d-x中也参照这个类,提供了CCNotificationCenter这个类,用作通知中心. 那么Noti ...

  8. [Leetcode][Python]23: Merge k Sorted Lists

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...

  9. saiku导出excel单元格格式与中文列宽自动适应

    在saiku导出excel后打开发现单元格的整数也显示为小数,并且含有中文的列宽没有自动适应,解决办法如下: 打开ExcelWorksheetBuilder.java文件,找到applyCellFor ...

  10. 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 ...