Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/75: Рейтинг темы: голосов - 75, средняя оценка - 5.00
1 / 0 / 1
Регистрация: 08.09.2018
Сообщений: 46

Как проверить вхождение элемента в массив эффективным образом?

15.09.2018, 18:58. Показов 16610. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Встала задача:
Даны два массива, элементы которых упорядочены по возрастанию (и зачем это дали?). Найти количество уникальных элементов, то есть, которые входят в один массив, но не входят в другой.

Пример
a[5] = {1,2,3,4,5,6}
b[6] = {3,4,5,6,7,8,9}
результатом будет 5 (1,2,7,8,9)

Сначала решил через множества:
нашел разность a-b; b-a; затем объединил их и получил количество уникальных элементов.

но вроде не пахнет эффективным решением, да и без массивов.. не думаю, что зачтут такую задачу..

Помогите с идеями, как подойти к задаче?)

Спасибо всем большое.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2018, 18:58
Ответы с готовыми решениями:

Вхождение одного элемента в другой массив
<? $val=array(0=>"Search", 1=>"Index", 2=>"Fast", 3=>"WebSite"); $aDoor = $_POST; for ($i=0; $i<(count($val)); $i++) ...

10. Найти первое вхождение элемента К в массив целых чисел
10. Найти первое вхождение элемента К в массив целых чисел.

Как проверить на вхождение строки в строку?
Есть строка: "https://www.google.ru/?gfe_rd=cr&ei=eUIIVLrbD8W9wAP0m4fygb" как проверить что в ней есть слово google ? на qt.

55
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 19:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Ваш код вообще не выполняет поставленную задачу.
Решается добавлением пары строчек:
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
#include <iostream>
#include <algorithm>
 
int
count_unique_elements(int* a, size_t size_a, int* b, size_t size_b) {
    int counter = 0;
    
    for (int i = 0; i < size_a; i++) {
        if ((a[i] < b[0]) or (a[i] > b[size_b - 1])
                or (std::find(b, b + size_b, a[i]) == (b + size_b))) {
            counter++;
        }
    }
    
    return counter;
}
 
int main() {
    int a[] = {1,2,3,4,5,6};
    int b[] = {3,4,5,6,7,8,9};
    
    auto count1 = count_unique_elements(a, sizeof(a)/sizeof(int), b, sizeof(b)/sizeof(int));
    auto count2 = count_unique_elements(b, sizeof(b)/sizeof(int), a, sizeof(a)/sizeof(int));
    std::cout << (count1 + count2) << std::endl;
    
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 20:27
stu4ent, я не зря отметил, что мой код это решает за линейное время, в отличие от Вашего.
Ну и для моего шаблона достаточно однонаправленных итераторов.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
23.09.2018, 21:47
zss, map же даёт nlogn.
n элементов массива * logn вставку.
Тут уже быстрее бинарным поиском без траты лишней памяти.

Вот запихнуть в unordered_map будет эффективно O(n+m) по скорости, O(min(n,m)) по памяти.

Добавлено через 7 минут
Croessmah, красиво.
Утянул на ideone к себе.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 22:37
Цитата Сообщение от Croessmah Посмотреть сообщение
я не зря отметил, что мой код это решает за линейное время, в отличие от Вашего.
Если важно время, то можно воспользоваться стандартной функцией https://en.cppreference.com/w/... difference, а не строить "велосипеды"

C++
1
2
3
4
5
size_t
count_unique_elements(int* a, size_t size_a, int* b, size_t size_b) {
    std::vector<int> v(size_a + size_b);
    return std::set_symmetric_difference(a, a + size_a, b, b + size_b, v.begin()) - v.begin();
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 22:45
stu4ent, она выполняет не ту работу, что требуется.
Она одинаковые элементы в одном последовательности запихнет как уникальные.
Кстати, этим и твой алгоритм страдает - он не выкидывает одинаковые элементы из последовательности.
1
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 22:49
По условию не сказано, что могут быть одинаковые элементы .
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 22:52
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
 
size_t
count_unique_elements(int* a, size_t size_a, int* b, size_t size_b) {
    std::vector<int> v(size_a + size_b);
    return std::set_symmetric_difference(a, a + size_a, b, b + size_b, v.begin()) - v.begin();
}
 
int main() {
    int a[] = {1,1,1};
    int b[] = {1,2,};
    
    auto count = count_unique_elements(a, sizeof(a)/sizeof(int), b, sizeof(b)/sizeof(int));
    std::cout << count << std::endl;
    
    return 0;
}
http://rextester.com/NHIRQ6666
ответ: 3

Добавлено через 2 минуты
Цитата Сообщение от stu4ent Посмотреть сообщение
По условию не сказано, что могут быть одинаковые элементы
Даны упорядоченные массивы. Никто не говорит, что элементы в каждом массиве уникальны.
Цитата Сообщение от fanfuntik Посмотреть сообщение
Найти количество уникальных элементов, то есть, которые входят в один массив, но не входят в другой.
Вот твой код с set_symmetric_difference вообще считает единички из первого массива за уникальные, хотя единичка есть во втором массиве. То есть задача не решена.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 22:56
Затестил алгоритмы:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <chrono>
#include <random>
#include <stdexcept>
#include <iterator>
 
void stu4ent_unique_difference(int* a, size_t size_a, int* b, size_t size_b, std::vector<int> & result) {   
    for (size_t i = 0; i < size_a; i++) {
        if ((a[i] < b[0]) or (a[i] > b[size_b - 1])
                or (std::find(b, b + size_b, a[i]) == (b + size_b))) {
            result.push_back(a[i]);
        }
    }
}
 
 
template<typename ForwardIterator>
ForwardIterator skip_equal(ForwardIterator first, ForwardIterator last)
{    
    if (first != last) {
        ForwardIterator prev = first++;
        while (first != last && *first == *prev) {
            ++prev;
            ++first;
        }
    }
    return first;
}
 
template<typename ForwardIterator, typename OutputIterator>
OutputIterator croessmah_unique_difference(
    ForwardIterator f_begin, ForwardIterator f_end, 
    ForwardIterator s_begin, ForwardIterator s_end, 
    OutputIterator out)
{    
    while (f_begin != f_end && s_begin != s_end) {
        if (*f_begin < *s_begin) {
            *out = *f_begin;
            f_begin = skip_equal(f_begin, f_end);
        } else if (*s_begin < *f_begin) {
            *out = *s_begin;
            s_begin = skip_equal(s_begin, s_end);
        } else {
            f_begin = skip_equal(f_begin, f_end);
            s_begin = skip_equal(s_begin, s_end);
        }
    }
    while (f_begin != f_end) {
        *out = *f_begin;
        f_begin = skip_equal(f_begin, f_end);
    }
    while (s_begin != s_end) {
        *out = *s_begin;
        s_begin = skip_equal(s_begin, s_end);
    }
    return out;
}
 
 
std::vector<int> generate_vector(size_t count)
{
    static std::mt19937 gen/*(std::chrono::system_clock::now().time_since_epoch().count())*/;
    std::uniform_int_distribution<int> dist(0, 100000);
    std::vector<int> result(count);
    for (auto & e: result) {
        e = dist(gen);
    }
    return result;
}
 
 
int main() {
    std::vector<int> first = generate_vector(1000000);
    std::vector<int> second = generate_vector(1000000);
    std::sort(first.begin(), first.end());
    std::sort(second.begin(), second.end());
 
    std::vector<int> result;
    result.reserve(first.size() + second.size());
    std::cout << "start..." << std::endl;
    auto start_tp = std::chrono::high_resolution_clock::now();
#ifndef CROESSMAH
    stu4ent_unique_difference(
        first.data(), first.size(), 
        second.data(), second.size(), 
        result);
    stu4ent_unique_difference(
        second.data(), second.size(), 
        first.data(), first.size(), 
        result);
#else
    croessmah_unique_difference(
        first.begin(), first.end(), 
        second.begin(), second.end(), 
        std::back_inserter(result));
#endif
    auto diff_time = std::chrono::high_resolution_clock::now() - start_tp;
    std::cout << "finish" << std::endl;
 
    std::cout << "unique before erase: " << result.size();
    std::sort(result.begin(), result.end());
    result.erase(std::unique(result.begin(), result.end()), result.end());
    
    std::cout << "\nunique: " << result.size()
              << "\nexecution time: " 
              << std::chrono::duration_cast<std::chrono::milliseconds>(diff_time).count() 
              << " ms" << std::endl;
    return 0;
}
g++ -o main -std=c++14 -O3 main.cpp
...
execution time: 359893 ms
g++ -o main -std=c++14 -O3 -DCROESSMAH main.cpp
...
execution time: 2 ms
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 22:56
Цитата Сообщение от Croessmah Посмотреть сообщение
Даны упорядоченные массивы. Никто не говорит, что элементы в каждом массиве уникальны.
Ели нужны уникальные, то вот:

C++
1
2
3
4
5
6
7
size_t
count_unique_elements(int* a, size_t size_a, int* b, size_t size_b) {
    std::set<int> s1(a, a + size_a);
    std::set<int> s2(b, b + size_b);
    std::vector<int> v(size_a + size_b);
    return std::set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), v.begin()) - v.begin();
}
Такая версия немного медленнее, но зато реализуется в N раз быстрее.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 23:01
Цитата Сообщение от stu4ent Посмотреть сообщение
Всё равно быстрее твоей версии, можешь померить с помощью clock
Замерил:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <chrono>
#include <random>
#include <stdexcept>
#include <iterator>
#include <set>
 
size_t
stu4ent_unique_difference(int* a, size_t size_a, int* b, size_t size_b) {
    std::set<int> s1(a, a + size_a);
    std::set<int> s2(b, b + size_b);
    std::vector<int> v(size_a + size_b);
    return std::set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), v.begin()) - v.begin();
}
 
template<typename ForwardIterator>
ForwardIterator skip_equal(ForwardIterator first, ForwardIterator last)
{    
    if (first != last) {
        ForwardIterator prev = first++;
        while (first != last && *first == *prev) {
            ++prev;
            ++first;
        }
    }
    return first;
}
 
template<typename ForwardIterator, typename OutputIterator>
OutputIterator croessmah_unique_difference(
    ForwardIterator f_begin, ForwardIterator f_end, 
    ForwardIterator s_begin, ForwardIterator s_end, 
    OutputIterator out)
{    
    while (f_begin != f_end && s_begin != s_end) {
        if (*f_begin < *s_begin) {
            *out = *f_begin;
            f_begin = skip_equal(f_begin, f_end);
        } else if (*s_begin < *f_begin) {
            *out = *s_begin;
            s_begin = skip_equal(s_begin, s_end);
        } else {
            f_begin = skip_equal(f_begin, f_end);
            s_begin = skip_equal(s_begin, s_end);
        }
    }
    while (f_begin != f_end) {
        *out = *f_begin;
        f_begin = skip_equal(f_begin, f_end);
    }
    while (s_begin != s_end) {
        *out = *s_begin;
        s_begin = skip_equal(s_begin, s_end);
    }
    return out;
}
 
 
std::vector<int> generate_vector(size_t count)
{
    static std::mt19937 gen/*(std::chrono::system_clock::now().time_since_epoch().count())*/;
    std::uniform_int_distribution<int> dist(0, 100000);
    std::vector<int> result(count);
    for (auto & e: result) {
        e = dist(gen);
    }
    return result;
}
 
 
int main() {
    std::vector<int> first = generate_vector(10000000);//Добавил еще нолик
    std::vector<int> second = generate_vector(10000000);//Добавил еще нолик
    std::sort(first.begin(), first.end());
    std::sort(second.begin(), second.end());
 
    std::vector<int> result;
    result.reserve(first.size() + second.size());
    std::cout << "start..." << std::endl;
    auto start_tp = std::chrono::high_resolution_clock::now();
#ifndef CROESSMAH
    std::size_t s = stu4ent_unique_difference(
        first.data(), first.size(), 
        second.data(), second.size());
#else
    croessmah_unique_difference(
        first.begin(), first.end(), 
        second.begin(), second.end(), 
        std::back_inserter(result));
    std::size_t s = result.size();
#endif
    auto diff_time = std::chrono::high_resolution_clock::now() - start_tp;
    std::cout << "finish" << std::endl;
 
    std::cout << "unique before erase: " << s;
    std::sort(result.begin(), result.end());
    result.erase(std::unique(result.begin(), result.end()), result.end());
    
    std::cout << "\nunique: " << result.size()
              << "\nexecution time: " 
              << std::chrono::duration_cast<std::chrono::milliseconds>(diff_time).count() 
              << " ms" << std::endl;
    return 0;
}


Только моя еще при этом в вектор вставляет. Повеселил на ночь, спасибо.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 23:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Только моя еще при этом в вектор вставляет. Повеселил на ночь, спасибо.
А моя по твоему в вектор ничего не вставляет?. Если нужен вектор, то надо лишь изменить "return", по заданию нужно число элементов. Видимо кто-то сегодня перетрудился.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё равно быстрее твоей версии, можешь померить с помощью clock
Я исправил это, тут немного обманул, случайно.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 23:16
Цитата Сообщение от stu4ent Посмотреть сообщение
А моя по твоему в вектор ничего не вставляет?
Вставляет-то вставляет, только зачем?
Будет лучше организовать итератор, который просто посчитает, сколько раз был вставлен элемент.
Но не суть, ведь это всё равно будет медленнее.
Цитата Сообщение от stu4ent Посмотреть сообщение
Если нужен вектор, то надо лишь изменить "return", по заданию нужно число элементов.
set_symmetric_difference работает примерно с такой же сложностью, как и мой алгоритм,
поэтому как только ты его применил, ты уже практически сравнял алгоритмы по сложности,
а все остальные операции делают сложность твоего алгоритма еще больше.

Применение set здесь - это вообще накладно, как по памяти, так и по времени.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 23:20
Цитата Сообщение от Croessmah Посмотреть сообщение
все остальные операции делают сложность твоего алгоритма еще больше
Новая версия :

C++
1
2
3
4
5
6
7
size_t
count_unique_elements(int* a, size_t size_a, int* b, size_t size_b) {
    std::vector<int> v(size_a + size_b);
    auto it = std::set_symmetric_difference(a, a + size_a, b, b + size_b, v.begin());
    v.resize(it - v.begin());
    return std::unique(v.begin(), v.end()) - v.begin();
}
Выполняется практически с такой же скоростью как и твоя версия. Реализация её тоже проще. Скорость на массиве из 1000000 элементов:
1) моя версия 13: мс;
2) твоя версия 10: мс.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 23:20
Цитата Сообщение от stu4ent Посмотреть сообщение
а не строить "велосипеды"
Если велосипед, написанный за 10-20 минут работает в тысячу раз быстрее, то я предпочту написать велосипед.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 23:23
Цитата Сообщение от Croessmah Посмотреть сообщение
тысячу раз быстрее,
проверь новую версию

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Будет лучше организовать итератор, который просто посчитает, сколько раз был вставлен элемент.
Да, наверно, в этом случае с памятью будет всё лучше, но его же ещё реализовать надо. Это требует, видимо, чуть-чуть больше времени.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 23:46
Лучший ответ Сообщение было отмечено sourcerer как решение

Решение

Цитата Сообщение от stu4ent Посмотреть сообщение
проверь новую версию
Это уже хорошо, я рассматривал такой вариант.
Правда, всё равно чуть медленнее из-за unique, но эта разница уже не велика.
Однако, у нас есть еще одно требование:
Цитата Сообщение от fanfuntik Посмотреть сообщение
кто-нибудь знает, эффективнее перебора и без использования библиотек что может быть?
я так понимаю, использовать алгоритмы из стандартной библиотеки нельзя.
Но это уже другая история. Теперь просто сравните производительность своего первого варианта и последнего. )))

Добавлено через 13 минут
stu4ent, тут, кстати, есть еще одно НО.
Если считать просто количество, то в моем алгоритме вектор и дополнительная память не нужны вообще:
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
template<typename ForwardIterator>
std::size_t count_unique(
    ForwardIterator f_begin, ForwardIterator f_end, 
    ForwardIterator s_begin, ForwardIterator s_end)
{    
    std::size_t result = 0;
    while (f_begin != f_end && s_begin != s_end) {
        if (*f_begin < *s_begin) {
            ++result;
            f_begin = skip_equal(f_begin, f_end);
        } else if (*s_begin < *f_begin) {
            ++result;
            s_begin = skip_equal(s_begin, s_end);
        } else {
            f_begin = skip_equal(f_begin, f_end);
            s_begin = skip_equal(s_begin, s_end);
        }
    }
    while (f_begin != f_end) {
        ++result;
        f_begin = skip_equal(f_begin, f_end);
    }
    while (s_begin != s_end) {
        ++result;
        s_begin = skip_equal(s_begin, s_end);
    }
    return result;;
}
Просто я сначала искал не количество, а сами элементы.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
23.09.2018, 23:48
Цитата Сообщение от Croessmah Посмотреть сообщение
без использования библиотек
Мне кажется, это относится ко всяким бустам и прочим сторонним, стандартная библиотека же есть часть языка.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.09.2018, 23:51
Цитата Сообщение от New man Посмотреть сообщение
стандартная библиотека же есть часть языка.
Это еще нужно доказать преподавателю...
Думаю, его интересует именно разработка алгоритма, а не использование готовых. Это же обучение.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
23.09.2018, 23:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Если считать просто количество, то в моем алгоритме вектор и дополнительная память не нужны вообще:
В своих тестах я использовал именно эту версию, только вместо "result" был "counter" .
0
24.09.2018, 07:45

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
-DCROESSMAH
Это что такое? о_О

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.09.2018, 07:45

Как проверить условие отсутствия в строке элемента необходимого столбца( массив одномерных массивов)
Заполнить строку и столбец содержащие первый min элемент нулями. Если в строке отсутсвует элемент необходимого столбца, то строку не...

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

Как проверить, есть ли в ячейке вхождение одной из строк?
Как проверить есть ли в ячейки вхождение одной из строк. Например, в ячейке есть текст 'пп, евро, на 2 кв-ры'. Надо определить есть в этой...

Как проверить на однократное вхождение точки в строку, причем только в конце строки?
Не работает Regex regex = new Regex(@&quot;\.{1}&quot;); if (regex.IsMatch(Text)) { ...

Заполните случайным образом одномерный массив из n элементов и определите номер элемента
Вариант 5: /из книги Паскаль для школьников, стр. 241/ 2. Заполните случайным образом одномерный массив из n элементов и ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru