Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
1

Вывести количество чисел во втором списке, которые содержатся в первом (как уменьшить время работы программы)

26.05.2013, 21:07. Показов 2553. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите пожалуйста как уменьшить время работы программы примерно на 0.5 секунд

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int n1 = int.Parse(Console.ReadLine());
            int[] a = new int[n1];
            for (int i = 0; i < n1; i++)
            { 
                a[i] = int.Parse(Console.ReadLine()); 
            }
 
            int n2 = int.Parse(Console.ReadLine());
            int[] b = new int[n2];
            for (int j = 0; j < n2; j++)
            { 
                b[j] = int.Parse(Console.ReadLine());
            }
 
            Array.Sort(a);
            int k=0;
            for (int j = 0; j < b.Length; j++)
            {
                for (int i = 0; i < a.Length; i++)
                {
                    if (b[j] == a[i])
                    {
                        k++;
                        break;
                    }
                }
            }
            Console.WriteLine(k);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2013, 21:07
Ответы с готовыми решениями:

Вывести количество чисел во втором списке, которые также содержатся в первом
Ребят, срочно нужна ваша помощь 1196. Экзамен по истории Ограничение времени: 2.0 секунды...

Вывести числа, которые содержатся в первом массиве и не содержатся во втором
Я начинающий программист, вот такая задачка у меня. В первом массиве 12 цифр, во втором 10. А...

Необходимо вывести уникальные элементы, которые присутствуют и в первом и во втором списке
Дано два списка строками с целыми числами через пробел. Необходимо вывести уникальные элементы (1...

Напечатать элементы, которые содержатся в первом и втором множествах одновременно
помогите пожалуйста решить задачу 5.11. Тема «Множества» Создать два множества из символов,...

19
284 / 255 / 73
Регистрация: 17.07.2012
Сообщений: 618
26.05.2013, 21:35 2
Не по теме:
быстрее вводить цифры?)
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
26.05.2013, 21:37  [ТС] 3
извините, не на 0.5 а на 0.05
0
25 / 25 / 35
Регистрация: 14.05.2013
Сообщений: 68
26.05.2013, 21:58 4
используйте какую-нибудь другую сортировку, написанную вами
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 22:10 5
22hope22, сортировка слиянием немного быстрее, чем быстрая. Но требует доп.памяти

Добавлено через 41 секунду
Оптимальный вариант - написать программу сортировки на C и использовать её. Ну или хотя бы самому написать небезопасную сортировку на шарпе (хотя я думаю qsort на указателях работает).
0
49 / 49 / 17
Регистрация: 23.02.2010
Сообщений: 437
26.05.2013, 22:14 6
использовать бинарный поиск, не просто так же сортируем)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 22:23 7
22hope22, кстати да. Попробуйте такой вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Linq;
 
namespace ConsoleApplication28
{
    public class Program
    {
        private static void Main()
        {
            int[] a = Enumerable.Range(1, 100).Select(x => x%10).ToArray();
            Array.Sort(a);
            const int toFind = 5;
            int index = Array.BinarySearch(a, toFind);
            int count = 0;
            for (int i = index; a[i] == toFind; i++)
                count++;
            for (int i = index - 1; a[i] == toFind; i--)
                count++;
            Console.WriteLine("Число {0} в массиве равно {1}", toFind, count);
            Console.ReadKey();
        }
    }
}
Добавлено через 1 минуту
Или вам нужно просто определить число общих элементов в коллекциях?о_0

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Linq;
 
namespace ConsoleApplication28
{
    public class Program
    {
        private static void Main()
        {
            int[] a = {1, 2, 3, 4, 5, 6, 7};
            int[] b = {9, 8, 7, 6, 5, 4, 3};
            int count = a.Intersect(b).Count();
            Console.WriteLine("Число общих элементов массивов a и b равно {0}", count);
            Console.ReadKey();
        }
    }
}
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
26.05.2013, 22:40  [ТС] 8
с int count = a.Intersect(b).Count(); программа не проходит тест
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 22:49 9
у меня 5мс длится на этих массивах. Надо еще меньше? Время сортировки включено в тест? И что за тест? Я не телепат.
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
26.05.2013, 23:15  [ТС] 10
задача с сайта и там она должна пройти определённые тесты. Сейчас она не проходит тест на время, но тест на алгоритм она прошла. Время работы должно быть не более 2 секунд
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 23:17 11
22hope22, дайте больше данных. И вопрос: разрешено ли применение небезопасного кода? В общем, все вопросы выше. В принципе я уже все сказал, для двух массивов длинной миллион мой алгоритм отрабатывает за 100 мс
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 23:17 12
Цитата Сообщение от Psilon Посмотреть сообщение
22hope22, дайте больше данных. И вопрос: разрешено ли применение небезопасного кода? В общем, все вопросы выше. В принципе я уже все сказал, для двух массивов длинной миллион мой алгоритм отрабатывает за 100 мс
Вывести количество чисел во втором списке, которые содержатся в первом (как уменьшить время работы программы)
0
49 / 49 / 17
Регистрация: 23.02.2010
Сообщений: 437
26.05.2013, 23:31 13
а если заполнить случайными числами?)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.05.2013, 23:33 14
Вывести количество чисел во втором списке, которые содержатся в первом (как уменьшить время работы программы)
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
27.05.2013, 00:58  [ТС] 15
тут не просто надо одинаковые цифры вывести http://acm.timus.ru/problem.aspx?space=1&num=1196 и этот сайт не принят с intersect
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.05.2013, 01:09 16
22hope22, это ваша персональаня ссылка, у других она не откроется. А вы за 2 страницы обсуждений так и не сказали. что код должен делать. Похвально, целеустремленность очень хорошая.
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
27.05.2013, 01:14  [ТС] 17
на словах это не так просто объяснить


Исходные данные
В первой строке содержится число N — количество записей в списке преподавателя. 1 ≤ N ≤ 15000. Затем идет N строк, содержащих список преподавателя, по одной дате в строке. Записаны только года. Каждый год — целое число в пределах от 1 до 109. Даты в этом списке отсортированы по неубыванию. В следующей после списка строке содержится число M — количество записей в списке студента, 1 ≤ M ≤ 106. Затем также M строк с датами (записаны только года, каждый год — целое число в пределах от 1 до 10^9). Этот список не отсортирован. В списке как студента, так и преподавателя даты могут повторяться.
Результат
Вы должны вывести одно число — количество чисел во втором списке, которые также содержатся в первом.
Пример
исходные данные
2
1054
1492
4
1492
65536
1492
100
результат
2
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.05.2013, 01:20 18
Ну это уже больше похоже на диалог.
Можно ли использовать небезопасный код? Только ли C#?

Добавлено через 1 минуту
Я кстати понял, почему Intersect не подошел, он же считает только уникальные совпадения.

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private static void Main()
        {
            int[] a = {1054, 1492};
            int[] b = {1492, 65536, 1492, 100};
            var c = GetCount(a, b);
            Console.WriteLine(c);
            Console.ReadKey();
        }
 
        private static int GetCount(IEnumerable<int> a, IEnumerable<int> b)
        {
            var set = new HashSet<int>(a);
            return b.Count(set.Contains);
        }
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
27.05.2013, 01:41  [ТС] 19
В принципе можно любой другой язык попробовать, но мне для курсовой с# нужен
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 58
17.06.2013, 17:51  [ТС] 20
Psilon, Привет, ты случайно не знаком с написанием тестов к задаче?
0
17.06.2013, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2013, 17:51
Помогаю со студенческими работами здесь

Посчитайте, сколько чисел содержится одновременно как в первом списке, так и во втором
Даны два списка чисел, которые могут содержать до 100000 чисел каждый. Посчитайте, сколько чисел...

Подсчитать, сколько чисел содержится одновременно как в первом списке, так и во втором (используя std::map)
Даны два списка чисел, которые могут содержать до 100000 чисел каждый. Посчитайте, сколько чисел...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru