除了循环之外,将数组中的值与字典中的其他值匹配的最快方法是什么?

本文关键字:其他 是什么 方法 字典 数组 循环 | 更新日期: 2023-09-27 18:06:26

我有一个充满蛋白质id的数组,并且我在字典中有蛋白质名称和id。我想打印出它在阵列上的每一个蛋白质。这是我用来做的方法,但它不够快,不能做大量的蛋白质。

string txt= "****** ID : {0} , Protien Name : {1} ******";
for (int i = 0; i < codonarray.Length; i++)
{
    if (codonarray[i] != null)
    {
        if (dictionaryproteins.TryGetValue(codonarray[i], out myvalue))
        { 
            Console.WriteLine(txt, codonarray[i], myvalue.name);
        }
    }
}

除了循环之外,将数组中的值与字典中的其他值匹配的最快方法是什么?

您正在使用的字典查找具有0(1)性能(参见:大0表示法)。这意味着一次查找所需的时间几乎是恒定的,并且不依赖于字典的大小。无论你在字典中有10个还是1000万个条目,这都无关紧要。

你想打印数组的每个元素。所以你需要循环遍历数组。您可以在某些LINQ结构中隐藏循环,但循环仍然存在并且无法优化。这是一个O(n)的操作。

这意味着你已经在以最优的方式进行匹配。综合性能(循环+查找)为O(n)。你不能做得更好。

如果您执行I/O操作,那么这很可能是性能问题的根源。尽量减少它们。使用缓冲、缓存等

只打印摘要或每n行打印一次。如果单是打印就花费了太多的时间,那么读取输出将花费多少时间?

控制台打印速度相对较慢。将数据写入文件而不是控制台

string[] fileContent = File.ReadAllLines(@"Phrases'Phrases.txt");

然后编码filecontent是什么,在你的例子中就是蛋白质信息。

一个8,980行文件的例子,我用它来进行语音识别,打印到一个文本框,你可以在你认为合适的时候改变它。它打印得非常快。

string[] fileContent0 = File.ReadAllLines(@"Phrases'Phrases.txt");
_recognizer.LoadGrammarAsync(new Grammar(new GrammarBuilder(new Choices(fileContent0))));