求一个高效的算法

tianliang1 2010-01-04 02:31:06
有如下数据放在一个数组里:
1001
1002
1001
1003
1001
1004
1004
我想给他们后面添加一个索引,结果放在另一个整型数组里
1001 1
1002 1
1001 2
1003 1
1001 3
1004 1
1004 2
就是把最后一列结果放在一个数组里
如果用两个循环来做的话,可以实现,但是当数据上10万行时,效率极低。希望高手帮我出一个高效的算法,谢谢!!!
...全文
150 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
LorenLiu 2010-01-04
  • 打赏
  • 举报
回复
等到下班居然都已经结贴了。。
LorenLiu 2010-01-04
  • 打赏
  • 举报
回复
你试试下面的方法吧,应该比双循环好点,期待高手出更快的方法


public Int32[] Function(Double[] data)
{
Dictionary<Double, Int32> dict = new Dictionary<Double, Int32>();

for (Int32 index = 0; index < data.Length; index++)
{
if (dict.ContainsKey(data[index]))
{
dict[data[index]]++;
}
else
{
dict.Add(data[index], 1);
}
}

Int32[] result = new Int32[data.Length];

for (Int32 index = data.Length - 1; index >= 0; index--)
{
result[index] = dict[data[index]];
dict[data[index]]--;
}

return result;
}
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
特别感谢你,你这样效率的确提高了很多。。。
没发给你了,以后一定补上。谢谢!!!
qldsrx 2010-01-04
  • 打赏
  • 举报
回复
虽然已经结贴了,不过还是给你改进下你原先的算法吧,这样肯定速度很快,对于重复率多的情况是最有效的:

int[] array = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
int[] addInt = new int[array.Length];
for (int i = 0; i < array.Length; i++)
{
addInt[i] = 1;
for (int j = i - 1; j >= 0; j--)
{
if (array[i] == array[j])
{
addInt[i] += addInt[j];
break;
}
}
}
烈火蜓蜻 2010-01-04
  • 打赏
  • 举报
回复
		int[] index = new int[array.Count];
Hashtable ht = new Hashtable();
for ( int i = 0; i < array.Count; i++ )
{
int t;
object tmp = ht[array[i]];
if ( tmp == null )
{
t = 1;
ht.Add( array[i], t );
}
else
{
t = ( int )tmp + 1;
ht[array[i]] = t;
}
index[i] = t;
}
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qldsrx 的回复:]
其实你原先的做法是最高效的做法,不需要用到Hashtable,只不过你没有写对。
[/Quote]
恩,谢谢提醒,不过我真的没有明白是哪个地方有错。。。
我用了新方法后,10多万行数据只要用了2秒左右的时间,我原来的方法用了30多秒。。。。
qldsrx 2010-01-04
  • 打赏
  • 举报
回复
其实你原先的做法是最高效的做法,不需要用到Hashtable,只不过你没有写对。
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
哦,果然对了。谢谢大家的帮组。马上结贴。。。
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
ls大哥这招感觉对了。我测试一下,谢谢你!!!
fengjian_428 2010-01-04
  • 打赏
  • 举报
回复
这样总行了吧 格式都一样了

int[] ia = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
int[] ic = new int[ia.Length];
Hashtable ht = new Hashtable();
for (int i = 0; i < ia.Length; i++)
{
if (ht.Contains(ia[i].ToString()))
{
ht[ia[i].ToString()] = Convert.ToInt32(ht[ia[i].ToString()]) + 1;
ic[i] = Convert.ToInt32(ht[ia[i].ToString()]);
}
else
{
ht.Add(ia[i].ToString(), 1);
ic[i] = 1;
}
}
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fengjian_428 的回复:]
这个副不符合要求? key是值 value是次数
C# codeint[] ia=newint[] {1001,1002,1001,1003,1001,1004,1004 };
Hashtable ht=new Hashtable();for (int i=0; i< ia.Length; i++)
{if (ht.Contains(ia[i].ToString()))
{
ht[ia[i].ToString()]= Convert.ToInt32(ht[ia[i].ToString()])+1;
}else
{
ht.Add(ia[i].ToString(),1);
}
}
[/Quote]
这个我都做过了。不行,只能得到第一个的数据。。。
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengjian_428 的回复:]
遍历一次应该可以了
[/Quote]
怎么做呀?具体点。。。谢谢
fengjian_428 2010-01-04
  • 打赏
  • 举报
回复
这个副不符合要求? key是值 value是次数

int[] ia = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
Hashtable ht = new Hashtable();
for (int i = 0; i < ia.Length; i++)
{
if (ht.Contains(ia[i].ToString()))
{
ht[ia[i].ToString()] = Convert.ToInt32(ht[ia[i].ToString()]) + 1;
}
else
{
ht.Add(ia[i].ToString(), 1);
}
}
fengjian_428 2010-01-04
  • 打赏
  • 举报
回复
遍历一次应该可以了
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
不可以排序。。。
我想过用Hashtable 和字典来做,可以水平有限没有弄出来,高手帮帮我。。。
tianliang1 2010-01-04
  • 打赏
  • 举报
回复
最后一列的数字大家看懂了吗,就是当前面有了的时候,就统计前面那个数据出现过的从次数!!!

1001 第一次出现 则添加数字 1
1001 第二出现 添加 2
1002 第一次出现 1
1001 第三出现了,则添加 3 这列添加的数字添用一个整型数组保存。。。
波导终结者 2010-01-04
  • 打赏
  • 举报
回复
一定要原始顺序吗?否则直接用排序就解决了
efour 2010-01-04
  • 打赏
  • 举报
回复
你上面写的代码有问题吧?
efour 2010-01-04
  • 打赏
  • 举报
回复
你可以考虑换种思路,在添加第一个数组时就别添加到数组里面,添加到Dictionary里面,key就放索引,value放值
tianliang1 2010-01-04
  • 打赏
  • 举报
回复

int [] addInt=new int[array.count];
for(int i=0;i<array.count;i++)
for(int j=0;j<i;j++)
{
if(array[i]==array[j])
addInt[i]++;
}

这种方式可以实现。但是效率很低,我想求一个高效的,快速的算法。高手些帮帮我!
加载更多回复(1)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧