0 / 4 / 0
Регистрация: 31.10.2016
Сообщений: 21
1

Time limit exceeded

22.02.2018, 21:15. Показов 8743. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решаю задачки на одном сайте, там есть онлайн компилятор. Моя VS справляется, но компилятор с сайта говорит Time limit exceeded. Т.к. задача состоит из нескольких классов опишу только проблемный.
В этом классе метод должен принимать List<List<string>> text (мы разбили большой текст на предложения, а после на слова, в конечном итоге List<List<string>> состоит только из слов с нижним регистром)
Сама задача: Биграмма — это пара соседних слов предложения. Например, из текста: "She stood up. Then she left." можно выделить следующие биграммы "She stood", "stood up", "Then she" и "she left", но не "up then".

Составьте словарь, который для каждого слова W хранит вторую часть V, наиболее частотной биграммы (W, V), начинающейся с W. Такой словарь называется биграммной моделью текста.

Ключи этого словаря — это все слова, с которых начинается хотя бы одна биграмма исходного текста. В качестве значения должно быть второе слово самой частой биграммы, начинающейся с ключа.

Если есть несколько биграмм с одинаковой частотой, то использовать лексикографически первую(в алфавит порядке) (используйте способ сравнения Ordinal, например с помощью метода string.CompareOrdinal).


В итоге должны получить Dictionary<string,string>. Вот мой код программы, подскажите,что в нем не так, в нем есть ошибка, или его надо оптимизировать?Если оптимизировать, то помогите!
За говнокод сорри.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections.Generic;
 
namespace TextAnalysis
{
    static class FrequencyAnalysisTask
    {
        public static Dictionary<string, string> GetMostFrequentNextWords(List<List<string>> text)
        {
            var dict = new Dictionary<string, int>();
            var bigram = new Dictionary<string, string>();
            var para = new List<string>();
            int chast = 0;
            string SecondWord = "";
            string FirstWord;
            string wordWas = null;
            for(int j = 0;j< text.Count;j++)
            {
                for (int i = 0; i < text[j].Count - 1; i++)
                {
                    para.Add(text[j][i] + ":" + text[j][i + 1]);
                }
            }
 
            for(int i = 0;i < para.Count;i++)
            {
                if (dict.ContainsKey(para[i]))
                    dict[para[i]]++;
                else
                    dict.Add(para[i], 1);
            }
            for(int i = 0;i<para.Count;i++)
            {
                chast = 0;
                foreach (var d in dict)
                {
                    FirstWord = para[i].Remove(para[i].IndexOf(":"));
                    if ((FirstWord.Equals(d.Key.Remove(d.Key.IndexOf(":"))))&&(d.Value>=chast))
                    {
                        if (string.IsNullOrEmpty(wordWas))
                            wordWas = d.Key.Remove(0, d.Key.IndexOf(":") + 1);
                        if (string.CompareOrdinal(d.Key.Remove(0, d.Key.IndexOf(":") + 1), wordWas) <= 0)
                        {
                            chast = d.Value;
                            SecondWord = d.Key.Remove(0, d.Key.IndexOf(":") + 1);
                            wordWas = SecondWord;
                        }
                    }
                }
                wordWas = null;
                if (!bigram.ContainsKey(para[i].Remove(para[i].IndexOf(":"))))
                {
                    bigram.Add(para[i].Remove(para[i].IndexOf(":")), SecondWord);
                }
            }
            return bigram;
        }
 
    }
}
2
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2018, 21:15
Ответы с готовыми решениями:

Time limit exceeded
Добрый день. Программа - бинарный поиск правой границы в упорядоченном множестве фраз. Возникает...

Acm.timus.ru Time limit exceeded
Добрый день. Сама задача http://acm.timus.ru/problem.aspx?space=1&amp;num=1021 и мое решение: ...

Time limit exceeded
http://acm.timus.ru/problem.aspx?space=1&amp;num=1196 Уже все перепробовал, и всегда возникает...

Посмотрела в логи - а там execution time limit exceeded by agent
Добрый день Есть много разных агентов, но, если проанализировать логи, то десяток раз за день...

3
1150 / 742 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
22.02.2018, 22:59 2
Time limit exceeded - значит не уложились во время, беглым взглядом можно заметить, что много работы со строками, а это не быстро. Но может и сам алгоритм медленный. Это с какого-то сайта задача? Есть туда открытый доступ, чтоб поэкспериментировать?
2
0 / 4 / 0
Регистрация: 31.10.2016
Сообщений: 21
22.02.2018, 23:22  [ТС] 3
Цитата Сообщение от Lexeq Посмотреть сообщение
Есть туда открытый доступ, чтоб поэкспериментировать?
https://ulearn.me/Course/Basic... 80895685e5
2
1150 / 742 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
22.02.2018, 23:32 4
Лучший ответ Сообщение было отмечено stealtheglory как решение

Решение

stealtheglory, вот такое проходит
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
29
30
        public static Dictionary<string, string> GetMostFrequentNextWords(List<List<string>> text)
        {
            Dictionary<string, Dictionary<string, int>> pairs = new Dictionary<string, Dictionary<string, int>>();
            foreach (var sentence in text)
            {
                for (int i = 0; i < sentence.Count - 1; i++)
                {
                    if (pairs.ContainsKey(sentence[i]))
                    {
                        if (pairs[sentence[i]].ContainsKey(sentence[i + 1]))
                            pairs[sentence[i]][sentence[i + 1]]++;
                        else
                            pairs[sentence[i]][sentence[i + 1]] = 1;
                    }
                    else
                    {
                        pairs[sentence[i]] = new Dictionary<string, int> { { sentence[i + 1], 1 } };
                    }
                }
            }
 
            Dictionary<string, string> result = new Dictionary<string, string>(pairs.Count);
 
            foreach (var item in pairs)
            {
                result.Add(item.Key, item.Value.OrderByDescending(x => x.Value).ThenBy(s => s.Key, StringComparer.Ordinal).First().Key);
            }
 
            return result;
        }
2
22.02.2018, 23:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2018, 23:32
Помогаю со студенческими работами здесь

Time limit exceeded Нужно оптимизировать код. ACMP Простые числа Постулат Бертрана
Задача 349 Простые числа из ******** (Время: 0,5 сек. Память: 32 Мб Сложность: 28%) Мое решение:...

Ошибка при решении задачи "Сумма максимума и минимума" - Time limit exceeded
Вот http://********/asp/do/index.asp?main=task&amp;id_course=1&amp;id_section=3&amp;id_topic=34&amp;id_problem=611...

ERROR: stack depth limit exceeded
всем привет! Создал тригер для инсерта и в результате вставки выдает ошибку ERROR: stack depth...

Ошибка в программе Stack limit exceeded. На пк всё работает
Всем привет, Прошу помочь. Написал код программы, которая решает определенную задачу. На...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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