- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于将其标记为重复的人,请理解我们不想要基于 LINQ 的解决方案。我们的真实示例有数万个范围内的几个原始列表,基于 LINQ 的解决方案的性能不足以满足我们的需求,因为它们必须多次遍历列表才能执行其功能,并随着每个新的源列表进行扩展。
这就是为什么我们专门寻找一种非 LINQ 算法,例如下面这个答案中建议的算法,它们通过枚举器同时遍历所有列表,并且只遍历一次。这似乎是迄今为止最好的,但我想知道是否还有其他的。
现在回到问题...
为了解释我们的问题,考虑这个假设的问题:
我有多个列表,但为了让这个示例简单,我们将其限制为两个,ListA 和 ListB,它们都是 List<int>
类型.他们的数据如下:
List A List B
1 2
2 3
4 4
5 6
6 8
8 9
9 10
...然而真正的列表可能有数万行。
我们接下来有一个名为 ListPairing 的类,其简单定义如下:
public class ListPairing
{
public int? ASide{ get; set; }
public int? BSide{ get; set; }
}
其中每个“边”参数实际上代表列表之一。 (即如果有四个列表,它也会有一个 CSide 和一个 DSide。)
我们正在尝试做的是构造一个List<ListPairing>
数据初始化如下:
A Side B Side
1 -
2 2
- 3
4 4
5 -
6 6
8 8
9 9
- 10
Again, note there is no row with '7'
如您所见,结果看起来像一个完整的外部联接。但是,请参阅下面的更新。
现在开始,我们可以简单地这样做......
var finalList = ListA.Select(valA => new ListPairing(){ ASide = valA} );
哪个产量...
A Side B Side
1 -
2 -
4 -
5 -
6 -
8 -
9 -
现在我们要回填列表 B 中的值。这需要首先检查是否存在与 BSide 匹配的 ASide 的现有 ListPairing,如果是,则设置 BSide。
如果不存在具有匹配 ASide 的现有 ListPairing,则仅使用 BSide 集(ASide 为空)实例化新的 ListPairing。
但是,考虑到所有必需的“FindFirst”调用,我觉得这不是执行此操作的最有效方法。 (这些列表可能有数万个项目。)
但是,预先将这些列表合并会产生以下值...
1, 2, 3, 4, 5, 6, 8, 9, 10 (Note there is no #7)
我的想法是以某种方式使用值的有序并集,然后同时“遍历”两个列表,根据需要构建 ListPairings。这消除了对 FindFirst 的重复调用,但我想知道这是否是最有效的方法。
想法?
人们认为这是使用 LINQ 获取完全外部联接的副本,因为结果是相同的......
我不是在 LINQ 完全外部联接之后。我追求高性能算法。
因此,我更新了问题。
我提出这个问题的原因是执行该功能所需的 LINQ 对于我们的需求来说太慢了。在我们的模型中,实际上有四个列表,每个列表都有几万行。这就是为什么我建议在最后使用 ID 的“联合”方法来获取要遍历的唯一“键”的列表,但我认为发布的关于做同样的事情但使用枚举器的答案是一个更好的方法,因为你不需要预先的 ID 列表。这将产生一次同时通过列表中所有项目的单次传递,这很容易优于基于 LINQ 的方法。
最佳答案
结果并没有我希望的那么整洁,但是如果两个输入列表都已排序,那么您可以一起遍历它们,比较每个列表的头部元素:如果它们相等,那么您就有了一对, 否则自己发出最小的一个并推进该列表。
public static IEnumerable<ListPairing> PairUpLists(IEnumerable<int> sortedAList,
IEnumerable<int> sortedBList)
{
// Should wrap these two in using() per Servy's comment with braces around
// the rest of the method.
var aEnum = sortedAList.GetEnumerator();
var bEnum = sortedBList.GetEnumerator();
bool haveA = aEnum.MoveNext();
bool haveB = bEnum.MoveNext();
while (haveA && haveB)
{
// We still have values left on both lists.
int comparison = aEnum.Current.CompareTo(bEnum.Current);
if (comparison < 0)
{
// The heads of the two remaining sequences do not match and A's is
// lower. Generate a partial pair with the head of A and advance the
// enumerator.
yield return new ListPairing() {ASide = aEnum.Current};
haveA = aEnum.MoveNext();
}
else if (comparison == 0)
{
// The heads of the two sequences match. Generate a pair.
yield return new ListPairing() {
ASide = aEnum.Current,
BSide = bEnum.Current
};
// Advance both enumerators
haveA = aEnum.MoveNext();
haveB = bEnum.MoveNext();
}
else
{
// No match and B is the lowest. Generate a partial pair with B.
yield return new ListPairing() {BSide = bEnum.Current};
// and advance the enumerator
haveB = bEnum.MoveNext();
}
}
if (haveA)
{
// We still have elements on list A but list B is exhausted.
do
{
// Generate a partial pair for all remaining A elements.
yield return new ListPairing() { ASide = aEnum.Current };
} while (aEnum.MoveNext());
}
else if (haveB)
{
// List A is exhausted but we still have elements on list B.
do
{
// Generate a partial pair for all remaining B elements.
yield return new ListPairing() { BSide = bEnum.Current };
} while (bEnum.MoveNext());
}
}
关于c# - 从多个单独列表中匹配项目的 'pair up' 最快的非 LINQ 算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913683/
什么是更快的安卓? Color.rgb(184, 134, 011); 或 Color.parseColor("#234181"); 还是别的什么? 答案:最快的似乎是: int mycolor =
没错, 基本上我需要计算出从服务器到最终用户的最短路线。我有 2 台服务器 - 一台在英国,一台在美国。 我需要根据最终用户的位置确定从哪个服务器加载内容。 我最初想使用 fsock/curl/fgc
我正在阅读固定宽度整数类型 ( cpp reference) 并遇到int_fast8_t、int_fast16_t、int_fast32_t 和 int_least8_t 类型,int_least1
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 6年前关闭。
我有大量目录,我想尽快读取所有文件。我的意思是,不是 DirectoryInfo.GetFiles 快,而是“get-clusters-from-disk-low-level”快。 当然,.NET 2
我尝试寻找最小的可被1到n整除的数字,现在我正在寻求有关进一步压缩/使我的解决方案更有效的方法的建议。如果也有O(1)解决方案,那将非常酷。 def get_smallest_number(n):
有很多不同的方法可以在驱动程序之间选择元素。我想知道哪一个最快且最适合 native 应用程序(iOS 和 Android)。 Appium Driver 类有: findElementByAcces
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
让矩阵 A 说 A = magic(100);。我见过两种计算矩阵 A 的所有元素之和的方法。 sumOfA = sum(sum(A)); 或者 sumOfA = sum(A(:)); 其中一个比另一
我想为玩具车在没有障碍物的平面 (2d) 上规划一条路线。玩具车应该从点 (p1x,p1y) 移动到 (p2x,p2y)(又名狄利克雷边界条件)。此外,玩具车在起点的速度是(v1x,v1y),终点处要
假设有 n 个 3 维对象(多面体)。最快的方法是计算所有对象的交集O(n^2)? 现在,我正在使用一个基本上强制 T(n) 等于 n ^ 2 的库: for each object: // ther
关闭。这个问题需要 details or clarity 。它目前不接受答案。 想改进这个问题吗? 添加细节并通过 editing this post 澄清问题。 关闭 5 年前。 Improve
在 c: 上,我有数以万计的 *.foobar 文件。它们在各种各样的地方(即子目录)。这些文件的大小大约为 1 - 64 kb,并且是纯文本。 我有一个 class Foobar(string fi
我的基本问题是有多个线程做一些事情,其中一些需要比其他线程更多的时间(20 倍甚至更多),他们需要的时间只取决于起始值,但不能从起始值预测单独他们需要多少时间。为了减少更快线程的空闲时间,我想通过
好的,我有一个疑问: select distinct(a) from mytable where b in (0,3) 什么会更快,上面的还是 select distinct(a) from myta
问题简介: 我正在开发一个生态生理模型,我使用了一个名为 S 的引用类列表。存储模型需要输入/输出的每个对象(例如气象、生理参数等)。 此列表包含 5 个对象(请参见下面的示例): - 两个数据帧,S
我有一个正在工作的问题陈述,但我仍然想知道更高效、更快,更重要的是正确设计来处理下面提到的场景。 我有一个 POJO 类 class A { String s; Double d; } 我正在
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this q
关于 LLVM 如何优化代码,关于 SO 以及整个网络都有一些非常好的描述。但这些都无法回答我的具体问题。 在 Xcode 中,项目和目标设置中有各种代码优化选项。我理解在开发过程中不需要优化,但为什
我正在用 C# 开发一个服务器项目,在收到 TCP 消息后,它会被解析并存储在一个精确大小的 byte[] 中。 (不是固定长度的缓冲区,而是存储所有数据的绝对长度的字节[]。) 现在为了阅读这个 b
我是一名优秀的程序员,十分优秀!