C# Улучшенный алгоритм

Ну, для приложения ClickOnce, которое я развернул в прошлом, мы использовали Microsoft.VisualBasic пространство имен для обработки поточной обработки экрана-заставки. Можно сослаться и использовать Microsoft.VisualBasic блок от C# в.NET 2.0, и это предоставляет много хороших услуг.

  1. Имеют основную форму, наследовались от Microsoft.VisualBasic.WindowsFormsApplicationBase
  2. Переопределение метод "OnCreateSplashScreen" как так:

    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new SplashForm();
        this.SplashScreen.TopMost = true;
    }
    

Очень простой, это показывает Ваш SplashForm (который необходимо создать), в то время как загрузка идет, затем закрывает его автоматически, как только основная форма завершила загрузку.

Это действительно делает вещи простыми, и эти VisualBasic.WindowsFormsApplicationBase, конечно, хорошо тестируется Microsoft и имеет большую функциональность, которая может сделать Вашу жизнь намного легче в Winforms, даже в приложении, которое является 100%-м C#.

В конце дня, это - весь IL и bytecode так или иначе, итак, почему бы не использовать его?

9
задан AboutDev 18 November 2009 в 19:50
поделиться

6 ответов

РЕДАКТИРОВАТЬ Лучшее решение: используйте За исключением , который не является симметричным, в отличие от Пересечение .

1 и 2: вы можете использовать для этого используется метод расширения Intersect . Однако , если ваш второй массив содержит элементы, не найденные в первом, они появятся в итоговом списке: Пересечение работает симметрично.

Что касается «двустороннего закрытия». ”, Я никогда не слышал об этом термине и скорее сомневаюсь, что это установленный технический термин.

10
ответ дан 4 December 2019 в 09:36
поделиться

Пример с использованием Except

var exclusions = new List<int>() { 1, 2, 3, 4 };
var newList = new List<int>() { 1, 2, 3, 4, 5, 56, 788, 9 };
IEnumerable<int>result = newList.Except(exclusions);
5
ответ дан 4 December 2019 в 09:36
поделиться

Ваш ответ - O (N ^ 2), потому что вам нужно искать в маленьком списке каждый элемент в большом списке. Возможно, вам повезет с использованием хэш-таблицы или отсортированного списка с двоичным поиском (в случае целых чисел / строк) и других способов уменьшить накладные расходы на поиск, которые, по крайней мере, приведут вас к O (N log N).

Обратите внимание: если размер маленького списка не похож на размер большого списка, ваше решение - O (N * M); вам нужно сначала оптимизировать обычно более крупный список. Если вы можете отсортировать первый список, это хороший выбор; если вам не разрешено изменять его, не забудьте отсортировать / хешировать второй список.

5
ответ дан 4 December 2019 в 09:36
поделиться

. Если не используется За исключением , и если вы хотите, чтобы ваше решение масштабировалось до больших списков, лучше всего было бы чтобы отсортировать второй список или создать из него хеш-таблицу, чтобы каждый элемент первого списка можно было легко идентифицировать во втором. (Так работает Кроме , более или менее.)

3
ответ дан 4 December 2019 в 09:36
поделиться

Я не верю, что опубликованный вами код работает. Стандартный массив не имеет метода contains. *

Не обращая внимания на эту проблему, возможно, проблема, которую он заметил в вашем ответе, заключается в том, что метод items.Contains в вашем примере выполняется для каждого элемента, который находится в списке, содержащем элементы для удалить. В результате в этом списке производится поиск каждого элемента в полном списке элементов.

Как уже упоминалось, использование метода Except было бы более эффективным.

РЕДАКТИРОВАТЬ: Не видел, чтобы вы сказали C # 3.0. Моя вина. По-прежнему синтаксическая ошибка между items1 и items.

-1
ответ дан 4 December 2019 в 09:36
поделиться
int[] items1={1,2,3,4}; 
List<int> newList = new List<int>() { 1, 2, 3, 4, 5, 56, 788, 9 };
newList.RemoveAll((int i) => { return items.Contains(i); });

1) Интервьюер ответил, что алгоритм, который я использовал, будет постепенно занимайте время, если предмет растет и попросил дать еще лучше и быстрее. Что было бы эффективным алгоритм?

Ваш items1 имеет длину m, а newlist имеет длину n. Поскольку вы выполняете линейный поиск по items1 для каждого элемента в newlist , ваше решение - O (n * m). С моей точки зрения, ваша реализация вполне приемлема, и нам, вероятно, не стоит беспокоиться об оптимизации до тех пор, пока она нам не понадобится.

Очевидно, однако, ее недостаточно для интервью. Хорошо, что "достаточно хорошо" для интервьюера? Кто знает. Теперь, если вы не возражаете против некоторого риска на собеседовании, вы можете попросить своего интервьюера более подробно рассказать о проблеме. Сообщите ему, что на скорость нашего кода влияет множество факторов и предположений, особенно выбор структуры данных:

  • Предположим, вам требуется индексированный доступ к newList , а затем преобразование items1 в HashSet (с поиском O (1)) улучшит ваш алгоритм до O (n) времени, необходимого для перестроить массив.

  • Предполагая, что newList - это «мешок» элементов, то есть нас не заботит порядок элементов в коллекции, а затем представляя newList хеш-набором позволяет нам удалить m элементов за время O (m).

  • Предполагая, что нам нужно сохранить порядок вставки элементов в коллекцию, вы можете представить newList как LinkedList {T}, используя Словарь {T, LinkedListNode} в качестве таблицы поиска. Когда вы добавляете элемент в коллекцию, вы добавляете его в LinkedList, а затем добавляете вновь созданный узел в словарь. LinkedList сохраняет порядок вставки, а Словарь позволяет нам удалить m элементов за O (m) раз. Однако мы жертвуем индексированным доступом к коллекции.

  • Предполагая, что newList хранит элементы в отсортированном порядке (это, похоже, не относится к предоставленному образцу кода, просто пошутите меня), большинство вариантов сбалансированные бинарные деревья удаляют m элементов за O (m log n), они также поддерживают обход отсортированного порядка O (n). Или, если вы в правильном настроении, пропускной список выполняет ту же работу, только глупее.

3) Он попросил меня привести пример они также поддерживают обход отсортированного порядка O (n). Или, если вы в правильном настроении, пропускной список выполняет ту же работу, только глупее.

3) Он попросил меня привести пример они также поддерживают обход отсортированного порядка O (n). Или, если вы в правильном настроении, пропускной список выполняет ту же работу, только глупее.

3) Он попросил меня привести пример для двустороннего закрытия? (Генерал, я осознает закрытие, что предназначено для Двустороннее закрытие ?, я ответил, что у меня есть когда-либо слышал этот термин, но он не

Я тоже никогда об этом не слышал, и Google, похоже, не показывает никаких соответствующих статей (кроме этой ветки, ни один из результатов на первых 5 страницах не относится к программированию или даже связан с компьютером). Интервьюер - идиот.

0
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: