比较高效地实现从两个不同数组中提取相同部分组成新的数组(暂时只支持Int类型)
来源:互联网 发布:淘宝代销零食要什么证 编辑:程序博客网 时间:2024/05/01 10:32
有时候我们需要从两个不同数组中提取出相同的部分的数组或者计算有多少个相同的项,这个算法刚好能派上用场,
实现方案:
1、将两个数组按从小到大排序;
2、遍历第一个数组 array1,跟第二个数组 array2 做比较;
3、如果找到相等的则提取出该数据并且记录下 array2 的下标到临时变量 t,下次循环则从 array2[t+1] 开始遍历 array2;
4、如果没有匹配到相等的而且 array2[t] 大于与 array1 对比的数据时, 记下 array2 当前下标到临时变量 t,下次循环则从 array2[t] 开始;
测试结果:
所谓的最笨的方法:
从图中可以看到运行效率有了很大的提升,
以上只是不成熟的解决方案,欢迎各位一起来讨论!
相关代码下载
实现方案:
1、将两个数组按从小到大排序;
2、遍历第一个数组 array1,跟第二个数组 array2 做比较;
3、如果找到相等的则提取出该数据并且记录下 array2 的下标到临时变量 t,下次循环则从 array2[t+1] 开始遍历 array2;
4、如果没有匹配到相等的而且 array2[t] 大于与 array1 对比的数据时, 记下 array2 当前下标到临时变量 t,下次循环则从 array2[t] 开始;
经过测试,该算法比“最笨”的作法无法在数组以何种方式排序都要强,如果量越多会越明显,有点可惜的是暂时只能使用在 Int[] 上,有时间再想一下其它数据类型的比较
获取两个整型数组中相等项的集合
获取两个整型数组中相等项的集合#region 获取两个整型数组中相等项的集合
/**//// <summary>
/// 获取两个整型数组中相等项的集合
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation(int[] array1, int[] array2)
{
int i1, i2;
// 记录第二个数组上一次匹配到的位置
int t = 0;
// 记录相同的项
List<int> equal = new List<int>();
int[] sort1 = BubbleSort(array1);
int[] sort2 = BubbleSort(array2);
for (int i = 0; i < sort1.Length; i++)
{
i1 = sort1[i];
for (int j = t; j < sort2.Length; j++)
{
i2 = sort2[j];
if (i2 == i1)
{
equal.Add(i2);
// 下次比较从下一位开始
t = j + 1;
}
else if (i2 > i1)
{
// 下次比较继续从这里开始
t = j;
break;
}
}
}
return equal.ToArray();
}
#endregion
获取两个整型数组中相等项的集合#region 获取两个整型数组中相等项的集合
/**//// <summary>
/// 获取两个整型数组中相等项的集合
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation(int[] array1, int[] array2)
{
int i1, i2;
// 记录第二个数组上一次匹配到的位置
int t = 0;
// 记录相同的项
List<int> equal = new List<int>();
int[] sort1 = BubbleSort(array1);
int[] sort2 = BubbleSort(array2);
for (int i = 0; i < sort1.Length; i++)
{
i1 = sort1[i];
for (int j = t; j < sort2.Length; j++)
{
i2 = sort2[j];
if (i2 == i1)
{
equal.Add(i2);
// 下次比较从下一位开始
t = j + 1;
}
else if (i2 > i1)
{
// 下次比较继续从这里开始
t = j;
break;
}
}
}
return equal.ToArray();
}
#endregion
冒泡法排序(非原创)
冒泡法排序(非原创)#region 冒泡法排序(非原创)
/**//// <summary>
/// 冒泡法排序
/// </summary>
/// <returns>排序结果: 从小到大(升序)</returns>
/// <see cref="http://www.aspcool.com/lanmu/browse1.asp?ID=1223&bbsuser=csharp"/>
public static int[] BubbleSort(int[] R)
{
int i, j, temp;
//交换标志
bool exchange;
//最多做R.Length-1趟排序
for (i = 0; i < R.Length; i++)
{
//本趟排序开始前,交换标志应为假
exchange = false;
for (j = R.Length - 2; j >= i; j--)
{
//交换条件
if (R[j + 1] < R[j])
{
temp = R[j + 1];
R[j + 1] = R[j];
R[j] = temp;
//发生了交换,故将交换标志置为真
exchange = true;
}
}
//本趟排序未发生交换,提前终止算法
if (!exchange)
{
break;
}
}
return R;
}
#endregion
冒泡法排序(非原创)#region 冒泡法排序(非原创)
/**//// <summary>
/// 冒泡法排序
/// </summary>
/// <returns>排序结果: 从小到大(升序)</returns>
/// <see cref="http://www.aspcool.com/lanmu/browse1.asp?ID=1223&bbsuser=csharp"/>
public static int[] BubbleSort(int[] R)
{
int i, j, temp;
//交换标志
bool exchange;
//最多做R.Length-1趟排序
for (i = 0; i < R.Length; i++)
{
//本趟排序开始前,交换标志应为假
exchange = false;
for (j = R.Length - 2; j >= i; j--)
{
//交换条件
if (R[j + 1] < R[j])
{
temp = R[j + 1];
R[j + 1] = R[j];
R[j] = temp;
//发生了交换,故将交换标志置为真
exchange = true;
}
}
//本趟排序未发生交换,提前终止算法
if (!exchange)
{
break;
}
}
return R;
}
#endregion
测试结果:
所谓的最笨的方法:
自我感觉最笨的作法
计算两个整型数组中数值相等的数量(最笨的方法)#region 计算两个整型数组中数值相等的数量(最笨的方法)
/**//// <summary>
/// 计算两个整型数组中数值相等的数量(最笨的方法)
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation1(int[] array1, int[] array2)
{
List<int> equal = new List<int>();
foreach (int i1 in array1)
{
foreach (int i2 in array2)
{
if (i1 == i2)
{
equal.Add(i1);
}
}
}
return equal.ToArray();
}
#endregion
计算两个整型数组中数值相等的数量(最笨的方法)#region 计算两个整型数组中数值相等的数量(最笨的方法)
/**//// <summary>
/// 计算两个整型数组中数值相等的数量(最笨的方法)
/// </summary>
/// <param name="array1"></param>
/// <param name="array2"></param>
/// <returns></returns>
public static int[] CompareEquation1(int[] array1, int[] array2)
{
List<int> equal = new List<int>();
foreach (int i1 in array1)
{
foreach (int i2 in array2)
{
if (i1 == i2)
{
equal.Add(i1);
}
}
}
return equal.ToArray();
}
#endregion
从图中可以看到运行效率有了很大的提升,
以上只是不成熟的解决方案,欢迎各位一起来讨论!
相关代码下载
- 比较高效地实现从两个不同数组中提取相同部分组成新的数组(暂时只支持Int类型)
- 提取数组中相同类别数据,组成新的数组
- php中比较两个数组内容,相同部分保留,不同的加上
- 从json数组中提取所需值,组成新的json数组
- 两个int类型的数组合并为新的数组
- iOS小问题--使用NSPredicate比较两个数组中相同(不同)的元素
- 比较两个数组中不同的值
- 比较两个数组中不同的数
- 列出两个数组中相同的字符(字符串组成数组)(数组的交集、差集)
- js中比较两个数组中是否含有相同的元素,可去重,可删除合并为新数组
- js中比较两个数组中是否含有相同的元素,可去重,可删除合并为新数组
- 两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?
- 一个数组中某个键的值相同则把相同的数组组成一个新数组
- PHP让数组中有相同值的组成新的数组
- 数组中只出现一次的两个不同数字
- 从两个数组中查找相同的数字谈Hashtable
- 找出一个int[]数组中满足 2^n的数字,然后组成的新的数组
- 比较取得两个字符串数组中相同元素和不同元素
- 网页脚本攻击防范全攻略(一)
- csdn最近系统有些问题
- 网页脚本攻击防范全攻略(二)
- 网页脚本攻击防范全攻略(三)
- 如何弹出一个模式窗口来显示进度条
- 比较高效地实现从两个不同数组中提取相同部分组成新的数组(暂时只支持Int类型)
- 用javascript实现的marquee效果
- 检验密码强度的JS类
- 把WebForm数据导出到Excel中
- 物理地址扩展(Physical Address Extensions, PAE)概述
- 对于IT部门定位及留人的讨论与回复
- 父亲
- linux-gate.so.1介绍补充(what is linux-gate.so.1?)
- 主板的芯片和插槽介绍