位图求交集
View Code
public
class 位图求交集
{
/// <summary>
/// 排序数组
/// </summary>
/// <param name="list"> 排序数组 </param>
/// <param name="MaxNumber"></param>
/// <returns></returns>
public static List< int> BitList(List<List< int>> list)
{
int count=list.Count;
int minInt = 0, maxInt = 0;
for ( int i = 0; i < list.Count; i++)
{
minInt = minInt < list[i][ 0] ? minInt : list[i][ 0];
maxInt = maxInt > list[i][list[i].Count - 1] ? maxInt : list[i][list[i].Count - 1];
}
List< int> result = new List< int>();
int[] DataForStore = new int[maxInt+ 1];
for ( int i = 0; i < list.Count; i++)
{
for ( int j = 0; j < list[i].Count; j++)
{
DataForStore[list[i][j]]++;
}
}
for ( int m = minInt; m < DataForStore.Length; m++)
{
if (DataForStore[m] == count)
{
result.Add(m);
}
}
return result;
}
/// <summary>
/// 非排序数组
/// </summary>
/// <param name="list"> 非排序数组 </param>
/// <param name="MaxNumber"></param>
/// <returns></returns>
public static List< int> BitList(List<List< int>> list, int MaxNumber)
{
List< int> result = new List< int>();
int[] DataForStore = new int[MaxNumber];
for ( int i = 0; i < list.Count; i++)
{
for ( int j = 0; j < list[i].Count; j++)
{
DataForStore[list[i][j]]++;
}
}
int length = list.Count;
for ( int m = 0; m < DataForStore.Length; m++)
{
if (DataForStore[m] == length)
{
result.Add(m);
}
}
return result;
}
{
/// <summary>
/// 排序数组
/// </summary>
/// <param name="list"> 排序数组 </param>
/// <param name="MaxNumber"></param>
/// <returns></returns>
public static List< int> BitList(List<List< int>> list)
{
int count=list.Count;
int minInt = 0, maxInt = 0;
for ( int i = 0; i < list.Count; i++)
{
minInt = minInt < list[i][ 0] ? minInt : list[i][ 0];
maxInt = maxInt > list[i][list[i].Count - 1] ? maxInt : list[i][list[i].Count - 1];
}
List< int> result = new List< int>();
int[] DataForStore = new int[maxInt+ 1];
for ( int i = 0; i < list.Count; i++)
{
for ( int j = 0; j < list[i].Count; j++)
{
DataForStore[list[i][j]]++;
}
}
for ( int m = minInt; m < DataForStore.Length; m++)
{
if (DataForStore[m] == count)
{
result.Add(m);
}
}
return result;
}
/// <summary>
/// 非排序数组
/// </summary>
/// <param name="list"> 非排序数组 </param>
/// <param name="MaxNumber"></param>
/// <returns></returns>
public static List< int> BitList(List<List< int>> list, int MaxNumber)
{
List< int> result = new List< int>();
int[] DataForStore = new int[MaxNumber];
for ( int i = 0; i < list.Count; i++)
{
for ( int j = 0; j < list[i].Count; j++)
{
DataForStore[list[i][j]]++;
}
}
int length = list.Count;
for ( int m = 0; m < DataForStore.Length; m++)
{
if (DataForStore[m] == length)
{
result.Add(m);
}
}
return result;
}
Test
View Code
两个时间差不多,1000000 数据 非排序的性能还要略微好点,都是40-50毫秒左右,性能至于最大的值有关,与每个数组的长度没关系