C# 获取数组中元素索引的快速方法是什么?

C# 获取数组中元素索引的快速方法是什么?,c#,java,.net,C#,Java,.net,我在一次采访中被问到这个问题。虽然这次面试是针对dotnet的职位,但他问我这个问题是与java相关的,因为我在简历中也提到了java 如何在数组中查找值为X的元素的索引 我说过,从第一个元素到最后一个元素进行迭代,并检查值是否为X将给出结果。他问到一种迭代次数较少的方法,我说使用二进制搜索,但这只适用于排序数组。我试着说在数组类中使用IndexOf函数。但我这边没有回答这个问题 有没有快速获取数组中具有值X的元素索引的方法?只要不知道数组(是否排序?升序还是降序?等等),就无法在不检查每个元素

我在一次采访中被问到这个问题。虽然这次面试是针对dotnet的职位,但他问我这个问题是与java相关的,因为我在简历中也提到了java

如何在数组中查找值为X的元素的索引

我说过,从第一个元素到最后一个元素进行迭代,并检查值是否为X将给出结果。他问到一种迭代次数较少的方法,我说使用二进制搜索,但这只适用于排序数组。我试着说在数组类中使用IndexOf函数。但我这边没有回答这个问题


有没有快速获取数组中具有值X的元素索引的方法?

只要不知道数组(是否排序?升序还是降序?等等),就无法在不检查每个元素的情况下找到元素

另外,这正是
indexOf
所做的(在使用列表时)。

Puneet-in.net its:

string[] testArray = {"fred", "bill"};
var indexOffset = Array.IndexOf(testArray, "fred");
[编辑]-现在正确地阅读了问题:)linq的另一种选择是:

string[] testArray = { "cat", "dog", "banana", "orange" };
int firstItem = testArray.Select((item, index) => new
{
    ItemName = item,
    Position = index

}).Where(i => i.ItemName == "banana")
  .First()
  .Position;
这当然会找到字符串的第一次出现。后续的复制将需要额外的逻辑。但循环方法也是如此


jim

如果无法进行二进制搜索(因为数组没有排序)并且您没有某种高级搜索索引,那么我唯一能想到的不是
O(n)
的方法是如果项目在数组中的位置是项目本身的函数(比如,如果数组是
[10,20,30,40]
,元素的位置
n
(n/10)-1

这是一个关于数据结构和算法的问题(尽管数据结构非常简单)。它超越了你所使用的语言

如果数组是有序的,您可以使用二进制搜索获得O(logn)和边界情况下的修改版本(不总是使用(a+b)/2作为轴心点,但这是一个非常复杂的怪癖)

如果阵列未排序,则。。。祝你好运

他可能会问您,为了在Java中查找项目,您有哪些方法。但不管怎样,他们并没有更快。它们可以更简单地使用(比for-each-compare-return更简单)


还有另一种解决方案是创建一个辅助结构来进行更快的搜索(如hashmap),但是,当然,创建并使用一次要比执行简单的线性搜索花费更高。

使用一个完全未排序的数组,只需内存中的数字列表。机器所能做的就是查看内存中的单个数字,并检查它们是否是正确的数字。这就是“密码破解问题”。没有比从头开始搜索直到找到正确的值更快的方法了。

你确定这个问题吗?我有一个问题和你的问题有点类似

给定一个排序数组,有一个元素“x”,其值与其索引相同。查找该元素的索引

例如:

         //0,1,2,3,4,5,6,7,8,9, 10     
int a[10]={1,3,5,5,6,6,6,8,9,10,11};
在索引6中,该值和索引是相同的

对于这个数组,答案应该是6


这不是答案,如果原始问题中遗漏了什么,这将澄清这一点。

找到更快答案的实用方法是并行处理

只需将数组分成N个部分,并将每个部分分配给一个线程,该线程将遍历其部分的元素,直到找到值为止。N最好是处理器的核数

如何在数组中查找值为X的元素的索引

这会很快:

int getXIndex(int x){ myArray[0] = x; return 0; } intgetxindex(intx){ myArray[0]=x; 返回0; }
也许他想测试你的Java知识

有一个名为Arrays的实用程序类,该类包含用于操作数组的各种方法(例如排序和搜索)

在两行中,您可以得到一个O(n*logn)结果:

如果您拥有的唯一信息是它是一个未排序的数组,索引和值之间没有关系,并且没有辅助数据结构,那么您必须检查每个元素,看看它是否包含您想要的信息

然而,面试的目的是把麦子和糠秕分开,所以重要的是要意识到他们想知道你是如何处理问题的。因此,我们的想法是问一些问题,看看是否有更多的信息可用(或可以提供),这些信息可以使您的搜索更有效

问题如下:


1/数据是否经常更改?

如果没有,则可以使用额外的数据结构

例如,维护一个初始为真的
dirty
标志。如果你想找到一个项目,并且它是真的,那么构建一个额外的结构(排序数组、树、散列或其他什么),这将大大加快搜索速度,然后将
dirty
标志设置为false,然后使用该结构来查找该项目

如果您想查找一个项目,而
dirty
标志为false,只需使用该结构,无需重新构建它

当然,对数据的任何更改都应该将
dirty
标志设置为true,以便下一次搜索重建结构

这将大大加快(通过摊销)对读取次数远多于写入次数的数据的查询

换言之,更改后的第一次搜索相对较慢,但后续搜索可能会快得多

您可能希望将数组包装在类中,以便正确控制
dirty
标志


2/是否允许使用与原始阵列不同的数据结构?

这将类似于上面给出的第一点。如果我们将数据结构从数组修改为包含该数组的任意类,您仍然可以获得所有的优势,例如快速随机访问每个元素

但是我们获得了更新的能力
    Arrays.sort(list); //O(n * log n)
    Arrays.binarySearch(list, 88)); //O(log n)