求一个循环遍历高效算法

happyRose 2010-03-08 09:05:47
for(int i=0;i<list1.count;i++)
{
for(int j=0;j<list2.count;j++)
{
if(list1.item[i]==list2.item[j])
{
do something;
break;
}
}
}
这种循环判断效率不高,想求一个高效的算法。
...全文
387 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2010-03-10
  • 打赏
  • 举报
回复
关键在于LZ的 do something 里面都干什么了?如果不涉及修改元素的值或移除集合中的某些元素,
就有高效的方法。

方法1:对两个list排序,然后用一次归并就可以找出重复的,前提是LZ需要给出排序的规则
方法2:用Dictionary,如果list里面的值不重复的话,用Dictionary<T,int>就可以,其中T是元素的类型,int里面记录元素的index。如果元素的值可以重复的话,则要根据需求,转化为Dictionary<T,List<int>>或,用Dictionary<T,int>只记录一遍。

LZ给的方法是个m*n的方法,方法1是个n*log(n) + m*log(m)的方法,方法2是个m+n的方法。
happyRose 2010-03-10
  • 打赏
  • 举报
回复
list 未必是集合,可能是数组或者是datatable的遍历,请给出高效算法代码
avengercf 2010-03-10
  • 打赏
  • 举报
回复
那就2叉树遍历吧,这总行了吧
vrhero 2010-03-09
  • 打赏
  • 举报
回复
假如楼主的do something中有修改集合成员的操作呢?简单地说“foreach()效率高”是不负责任的...
zzx509 2010-03-09
  • 打赏
  • 举报
回复
如果两个集合的元素是有序的,只要循环集合中元素个数的次数就可以了,但排序也是要代价的。
这要看集合是否能进行有序插入或仅一次排序,N多次的需要比较两个集合元素相同。
不能排序的话,算法本质都是两重循环。
avengercf 2010-03-09
  • 打赏
  • 举报
回复
可以试试2分法遍历,效果至少好一倍
abaochan 2010-03-09
  • 打赏
  • 举报
回复
我建了一个.NET技术讨论群,希望大家踊跃加入70778248
ITJaneLiu 2010-03-09
  • 打赏
  • 举报
回复
学习>>>>>>>>>>>>>>>>>>>>>
stning 2010-03-09
  • 打赏
  • 举报
回复
Contains效率高不高,应该是跟内部实现的hashcode有直接的关系。如果lz的集合里面不会出现重复项,那建议用hashset的Contains做比较。效率有保证
cjcgy 2010-03-08
  • 打赏
  • 举报
回复
如果集合重复元素多, 试试把重复元素找出来
然后一起处理。
cnzdgs 2010-03-08
  • 打赏
  • 举报
回复
list1、list2是什么类型?有没有Find之类的方法?如果没有,可以自己用Hashtable查找。
happy664618843 2010-03-08
  • 打赏
  • 举报
回复
list
十八道胡同 2010-03-08
  • 打赏
  • 举报
回复
引用楼主 happyrose 的回复:
for(int i=0;i <list1.count;i++)
{
    for(int j=0;j <list2.count;j++)
    {
        if(list1.item[i]==list2.item[j])
        {
            do something;
            break;
        }
    }
}
这种循环判断效率不高,想求一个高效的算法。

for(int i=0;i <list1.count;i++)
{
if(list1.contains...)
{
do something;
break;
}

}
fengling2001 2010-03-08
  • 打赏
  • 举报
回复
排序下list1,list2,然后查找判断,效率会好点
wuyq11 2010-03-08
  • 打赏
  • 举报
回复
foreach(string str1 in list1)
{
foreach(string str2 in list2)
{
if(str1.Equals(str2))
{

}
}
}
或使用LINQ,正确和RemoveAll(delegate{});
段传涛 2010-03-08
  • 打赏
  • 举报
回复
foreach()代替次数循环for
Snowdust 2010-03-08
  • 打赏
  • 举报
回复
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
list1.Add(1);
list1.Add(3);
list1.Add(5);
list2.Add(2);
list2.Add(4);
list2.Add(3);
for (int i = 0; i < list1.Count; i++)
{
if (list2.Contains(list1[i]))
{
//do something;
break;
}
}
jiangshun 2010-03-08
  • 打赏
  • 举报
回复
foreach()效率要高点!
或者只用一个循环用list1.Contains
xray2005 2010-03-08
  • 打赏
  • 举报
回复
List<string> list1=new List<string>();
List<string> list2=new List<string>();

foreach(string str1 in list1)
{
foreach(string str2 in list2)
{
if(str1==str2)
{
//to do
break;
}
}
}

PS:我发现Contains方法似乎还没有循环快。
1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D) A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征D.栈有后进先出的特征 6.链表不具有的特点是(B)A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间与线性表长度成正比 7.用链表表示线性表的优点是(便于插入和删除操作) 8.在单链表中,增加头结点的目的是(方便运算的实现) 9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 10.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D) A.每个元素都有一个直接前件和直接后件 B.线性表中至少要有一个元素 C.表中诸元素的排列顺序必须是由小到大或由大到小 D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件 11.线性表若采用链式存储结构时,要内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的C.一定是不连续的 D.连续不连续都可以 12.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 13.树是结点的集合,它的根结点数目是(有且只有1) 14.在深度为5的满二叉树中,叶子结点的个数为(31) 15.具有3个结点的二叉树有(5种形态) 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13) 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA) 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 20.数据库保护分为:安全性控制、 完整性控制 、并发性控制和数据的恢复。 1. 在计算机中,算法是指(解题方案的准确而完整的描述) 2.在下列选项中,哪个不是一个算法一般应该具有的基本特征(无穷性) 说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。 3. 算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 4.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 5. 算法的空间复杂度是指(执行过程中所需要的存储空间) 6. 算法分析的目的是(分析算法的效率以改进) ............ .................

111,093

社区成员

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

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

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