16namespace layer1_foundations {
17namespace data_structures {
20static void int_vec_partition(
int *v,
21 int (*compare_func)(
int a,
int b),
22 int left,
int right,
int *middle);
23static void lint_vec_partition(
long int *v,
24 int (*compare_func)(
long int a,
long int b),
int left,
int right,
int *middle);
25static void partition(
void **v,
int *perm,
26 int (*compare_func)(
void *a,
void *b,
void *data),
void *data,
27 int left,
int right,
int *middle);
28static void quicksort(
void **v,
int *perm,
29 int (*compare_func)(
void *a,
void *b,
void *data),
void *data,
32static int compare_increasingly_int(
int a,
int b);
33static int compare_decreasingly_int(
int a,
int b);
34static int compare_increasingly_lint(
long int a,
long int b);
35static int compare_decreasingly_lint(
long int a,
long int b);
49 int *v,
int len,
int *A,
int A_sz,
int *Idx)
53 for (i = 0; i < A_sz; i++) {
55 cout <<
"sorting::int_vec_search_vec did not find entry" << endl;
62 long int *v,
int len,
long int *A,
int A_sz,
long int *Idx)
66 for (i = 0; i < A_sz; i++) {
68 cout <<
"sorting::int_vec_search_vec did not find entry" << endl;
76 int *v,
int len,
int *A,
int A_sz,
int *Idx)
80 for (i = 0; i < A_sz; i++) {
82 cout <<
"int_vec_search_vec did not find entry" << endl;
89 long int *v,
int len,
long int *A,
int A_sz,
long int *Idx)
93 for (i = 0; i < A_sz; i++) {
95 cout <<
"lint_vec_search_vec did not find entry" << endl;
103 int *set,
int sz,
int *big_set,
int big_set_sz)
108 for (i = 0; i < sz; i++) {
110 while (big_set[j] < a && j < big_set_sz) {
113 if (j == big_set_sz) {
116 if (big_set[j] == a) {
126 int *set,
int sz,
long int *big_set,
int big_set_sz,
int verbose_level)
129 int f_v = (verbose_level >= 1);
132 for (i = 0; i < sz; i++) {
134 while (big_set[j] < a && j < big_set_sz) {
137 if (j == big_set_sz) {
140 if (big_set[j] == a) {
143 cout <<
"element " << a <<
" has been found" << endl;
153 int *list,
int *list_inv,
int idx1,
int idx2)
172 for (i = 1; i < len; i++) {
173 if (v[i - 1] > v[i]) {
185 for (i = len - 1; i > 0; i--) {
186 if (v[i] == v[i - 1]) {
187 for (j = i + 1; j < len; j++) {
200 for (i = len - 1; i > 0; i--) {
201 if (v[i] == v[i - 1]) {
202 for (j = i + 1; j < len; j++) {
211 int *v1,
int len1,
int *v2,
int len2)
217 for (i = 0, j = 0; i < len1; ) {
221 if (v1[i] == v2[j]) {
225 else if (v1[i] > v2[j]) {
228 else if (v1[i] < v2[j]) {
236 long int *v1,
int len1,
long int *v2,
int len2)
242 for (i = 0, j = 0; i < len1; ) {
246 if (v1[i] == v2[j]) {
250 else if (v1[i] > v2[j]) {
253 else if (v1[i] < v2[j]) {
273 if (v1[i] == v2[j]) {
279 else if (v1[i] > v2[j]) {
287 int *v2,
int len2,
int &idx1,
int &idx2)
300 if (v1[i] == v2[j]) {
308 else if (v1[i] > v2[j]) {
316 long int *v2,
int len2,
int &idx1,
int &idx2)
329 if (v1[i] == v2[j]) {
337 else if (v1[i] > v2[j]) {
345 int *&vec,
int &used_length,
346 int &alloc_length,
int a,
349 int f_v = (verbose_level >= 1);
350 int f_vv = (verbose_level >= 2);
354 cout <<
"int_vec_insert_and_reallocate_if_necessary" << endl;
358 cout <<
"int_vec_insert_and_reallocate_if_necessary "
359 "element " << a <<
" is already in the list" << endl;
363 if (used_length == alloc_length) {
365 int new_alloc_length;
367 new_alloc_length = 2 * alloc_length;
368 cout <<
"reallocating to length " << new_alloc_length << endl;
370 for (t = 0; t < used_length; t++) {
375 alloc_length = new_alloc_length;
377 for (t = used_length; t > idx; t--) {
383 cout <<
"element " << a <<
" has been added to the "
384 "list at position " << idx <<
" n e w length = "
385 << used_length << endl;
388 if ((used_length & (1024 - 1)) == 0) {
389 cout <<
"used_length = " << used_length << endl;
394 cout <<
"int_vec_insert_and_reallocate_if_necessary done" << endl;
399 int &used_length,
int &alloc_length,
int a,
402 int f_v = (verbose_level >= 1);
407 cout <<
"int_vec_append_and_reallocate_if_necessary" << endl;
409 if (used_length == alloc_length) {
411 int new_alloc_length;
413 new_alloc_length = 2 * alloc_length;
414 cout <<
"reallocating to length " << new_alloc_length << endl;
416 for (t = 0; t < used_length; t++) {
421 alloc_length = new_alloc_length;
423 vec[used_length] = a;
426 cout <<
"element " << a <<
" has been appended to the list "
427 "at position " << used_length - 1 <<
" n e w "
428 "length = " << used_length << endl;
431 if ((used_length & (1024 - 1)) == 0) {
432 cout <<
"used_length = " << used_length << endl;
436 cout <<
"int_vec_append_and_reallocate_if_necessary "
442 int &used_length,
int &alloc_length,
long int a,
445 int f_v = (verbose_level >= 1);
450 cout <<
"lint_vec_append_and_reallocate_if_necessary" << endl;
452 if (used_length == alloc_length) {
454 int new_alloc_length;
456 new_alloc_length = 2 * alloc_length;
457 cout <<
"reallocating to length " << new_alloc_length << endl;
459 for (t = 0; t < used_length; t++) {
464 alloc_length = new_alloc_length;
466 vec[used_length] = a;
469 cout <<
"element " << a <<
" has been appended to the list "
470 "at position " << used_length - 1 <<
" n e w "
471 "length = " << used_length << endl;
474 if ((used_length & (1024 - 1)) == 0) {
475 cout <<
"used_length = " << used_length << endl;
479 cout <<
"lint_vec_append_and_reallocate_if_necessary "
488 for (i = 0; i < len; i++) {
507 for (i = 0; i < set_size; i++) {
508 if (S1[i] != S2[i]) {
531 for (i = 0; i < sz1; i++) {
550 for (i = 0; i < set_size; i++) {
554 for (i = 0; i < set_size - 1; i++) {
555 if (S[i] == S[i + 1]) {
556 cout <<
"the set is not a set: the element "
557 << S[i] <<
" is repeated" << endl;
570 for (i = 0; i < set_size; i++) {
574 for (i = 0; i < set_size - 1; i++) {
575 if (S[i] == S[i + 1]) {
576 cout <<
"the set is not a set: the element "
577 << S[i] <<
" is repeated" << endl;
592 for (i = 0; i < set_size; i++) {
596 for (i = 0; i < set_size - 1; i++) {
597 if (S[i] == S[i + 1]) {
598 cout <<
"the set is not a set: the element "
599 << S[i] <<
" is repeated" << endl;
609 int *set,
int *subset,
int *rearranged_set,
612 int f_v = (verbose_level >= 1);
615 for (i = 0; i < n; i++) {
616 if (j < k && subset[j] == i) {
617 rearranged_set[j] = set[subset[j]];
621 rearranged_set[k + i - j] = set[i];
625 cout <<
"rearrange_subset ";
629 cout <<
"rearrange_subset subset=";
630 int_vec_print(cout, set, n);
632 int_vec_print(cout, subset, k);
634 int_vec_print(cout, rearranged_set, n);
641 long int *set,
int *subset,
long int *rearranged_set,
644 int f_v = (verbose_level >= 1);
647 for (i = 0; i < n; i++) {
648 if (j < k && subset[j] == i) {
649 rearranged_set[j] = set[subset[j]];
653 rearranged_set[k + i - j] = set[i];
657 cout <<
"rearrange_subset ";
664 long int *set,
long int *subset,
long int *rearranged_set,
667 int f_v = (verbose_level >= 1);
670 for (i = 0; i < n; i++) {
671 if (j < k && subset[j] == i) {
672 rearranged_set[j] = set[subset[j]];
676 rearranged_set[k + i - j] = set[i];
680 cout <<
"rearrange_subset ";
690 for (i = 0; i < len; i++) {
703 for (i = 0; i < len; i++) {
713 int *v2,
int len2,
int *&v3,
int &len3)
720 for (i = 0; i < len1; i++) {
723 for (i = 0; i < len2; i++) {
730 for (i = 0; i < len1; i++) {
742 long int *v2,
int len2,
long int *&v3,
int &len3)
750 for (i = 0; i < len1; i++) {
753 for (i = 0; i < len2; i++) {
760 for (i = 0; i < len1; i++) {
772 int *v2,
int len2,
int *v3,
int &len3)
780 if (i >= len1 || j >= len2) {
801 long int *v2,
int len2,
long int *v3,
int &len3)
809 if (i >= len1 || j >= len2) {
831 int *perm,
int *perm_inv,
int f_increasingly)
841 for (i = 0; i < len; i++) {
842 pairs[i * 2 + 0] = v[i];
843 pairs[i * 2 + 1] = i;
844 V[i] = pairs + i * 2;
846 if (f_increasingly) {
852 for (i = 0; i < len; i++) {
853 perm_inv[i] = V[i][1];
855 perm_inverse(perm_inv, perm, len);
863 for (i = 0; i < len; i++) {
867 if (!f_increasingly) {
871 for (i = 0; i < n2; i++) {
873 v[i] = v[len - 1 - i];
876 perm_inv[i] = perm_inv[len - 1 - i];
877 perm_inv[len - 1 - i] = a;
885 int (*compare_func)(
int a,
int b),
int left,
int right)
890 int_vec_partition(v, compare_func, left, right, &middle);
897 int (*compare_func)(
long int a,
long int b),
int left,
int right)
902 lint_vec_partition(v, compare_func, left, right, &middle);
930 int (*compare_func)(
void *a,
void *b,
void *data),
void *data)
934 quicksort(v, NULL, compare_func, data, 0, len - 1);
938 int (*compare_func)(
void *a,
void *b,
void *data),
void *data)
942 quicksort(v, perm, compare_func, data, 0, len - 1);
946 int (*compare_func)(
void *a,
void *b,
void *data),
947 void *data_for_compare,
948 int len,
void *a,
int &idx,
int verbose_level)
952 int f_v = (verbose_level >= 1);
955 cout <<
"sorting::vec_search len=" << len << endl;
970 cout <<
"sorting::vec_search l=" << l <<
" r=" << r << endl;
975 res = (*compare_func)(a, v[m], data_for_compare);
977 cout <<
"sorting::vec_search m=" << m <<
" res=" << res << endl;
999 cout <<
"sorting::vec_search done, "
1000 "f_found=" << f_found <<
" idx=" << idx << endl;
1006 int (*compare_func)(
void *vec,
void *a,
int b,
void *data_for_compare),
1007 void *data_for_compare,
1008 int len,
void *a,
int &idx,
int verbose_level)
1011 int f_found =
FALSE;
1012 int f_v = (verbose_level >= 1);
1015 cout <<
"vec_search_general len=" << len << endl;
1029 cout <<
"vec_search_general l=" << l <<
" r=" << r << endl;
1034 res = (*compare_func)(vec, a, m, data_for_compare);
1036 cout <<
"m=" << m <<
" res=" << res << endl;
1065 for (t = len - 1; t >= idx; t--) {
1082 for (t = idx; t < len - 1; t++) {
1102 int f_found =
FALSE;
1121 cout <<
"l=" << l <<
" r=" << r<<
" m=" << m
1122 <<
" v[m]=" << v[m] <<
" res=" << res << endl;
1133 cout <<
"moving to the right" << endl;
1141 cout <<
"moving to the left" << endl;
1158 long int a,
int &idx,
int verbose_level)
1165 int f_v = (verbose_level >= 1);
1168 int f_found =
FALSE;
1171 cout <<
"sorting::lint_vec_search len=" << len <<
", searching for " << a << endl;
1186 cout <<
"sorting::lint_vec_search l=" << l <<
" m=" << m <<
" r=" << r << endl;
1192 cout <<
"sorting::lint_vec_search v[m]=" << v[m] <<
" a=" << a << endl;
1203 cout <<
"moving to the right" << endl;
1207 cout <<
"f_found = TRUE" << endl;
1214 cout <<
"moving to the left" << endl;
1228 cout <<
"sorting::lint_vec_search len=" << len <<
", searching "
1229 "for " << a <<
" done, f_found=" << f_found
1230 <<
" idx=" << idx << endl;
1236 long int a,
int &idx,
int verbose_level)
1243 int f_v = (verbose_level >= 1);
1247 int f_found =
FALSE;
1251 cout <<
"sorting::vector_lint_search len=" << len <<
", searching for " << a << endl;
1266 cout <<
"sorting::vector_lint_search l=" << l <<
" m=" << m <<
" r=" << r << endl;
1272 cout <<
"sorting::vector_lint_search v[m]=" << v[m] <<
" a=" << a << endl;
1283 cout <<
"moving to the right" << endl;
1287 cout <<
"f_found = TRUE" << endl;
1294 cout <<
"moving to the left" << endl;
1308 cout <<
"sorting::vector_lint_search len=" << len <<
", searching "
1309 "for " << a <<
" done, f_found=" << f_found
1310 <<
" idx=" << idx << endl;
1315 int len,
int a,
int &idx,
1320 int f_found =
FALSE;
1321 int f_v = (verbose_level >= 1);
1324 cout <<
"int_vec_search_first_occurence searching for " << a
1325 <<
" len=" << len << endl;
1334 cout <<
"int_vec_search_first_occurence searching for "
1335 << a <<
" l=" << l <<
" r=" << r << endl;
1347 cout <<
"int_vec_search_first_occurence l=" << l
1348 <<
" r=" << r<<
" m=" << m <<
" v[m]=" << v[m] << endl;
1360 cout <<
"int_vec_search_first_occurence "
1361 "moving to the right" << endl;
1367 cout <<
"int_vec_search_first_occurence "
1368 "moving to the left" << endl;
1372 cout <<
"int_vec_search_first_occurence "
1373 "we found the element" << endl;
1388 cout <<
"int_vec_search_first_occurence done "
1389 "f_found=" << f_found <<
" idx=" << idx << endl;
1398 int f_found =
FALSE;
1446 int f_backwards =
TRUE;
1461 for (i = 0; i < w_len; i++) {
1469 int *&w,
int &w_len)
1478 for (i = 0; i < w_len; i++) {
1484 int *&val,
int *&mult,
int &nb_values)
1494 for (i = 0; i < nb_values; i++) {
1504 int *the_vec,
int *&the_vec_sorted,
1505 int *&sorting_perm,
int *&sorting_perm_inv,
1506 int &nb_types,
int *&type_first,
int *&type_len)
1511 cout <<
"int_vec_classify length is zero" << endl;
1515 the_vec_sorted =
NEW_int(length);
1516 sorting_perm =
NEW_int(length);
1517 sorting_perm_inv =
NEW_int(length);
1522 sorting_perm, sorting_perm_inv,
1523 nb_types, type_first, type_len);
1528 int *the_vec,
int *the_vec_sorted,
1529 int *sorting_perm,
int *sorting_perm_inv,
1530 int &nb_types,
int *type_first,
int *type_len)
1534 for (i = 0; i < length; i++) {
1535 the_vec_sorted[i] = the_vec[i];
1538 length, sorting_perm, sorting_perm_inv,
1540 for (i = 0; i < length; i++) {
1541 the_vec_sorted[sorting_perm[i]] = the_vec[i];
1545 nb_types, type_first, type_len);
1551 for (i = 1; i < length; i++) {
1552 if (the_vec_sorted[i] == the_vec_sorted[i - 1]) {
1553 type_len[nb_types]++;
1556 type_first[nb_types + 1] =
1557 type_first[nb_types] + type_len[nb_types];
1559 type_len[nb_types] = 1;
1567 int *the_vec_sorted,
1568 int &nb_types,
int *type_first,
int *type_len)
1579 for (i = 1; i < length; i++) {
1580 if (the_vec_sorted[i] == the_vec_sorted[i - 1]) {
1581 type_len[nb_types]++;
1584 type_first[nb_types + 1] =
1585 type_first[nb_types] + type_len[nb_types];
1587 type_len[nb_types] = 1;
1595 int *the_vec_sorted;
1597 int *sorting_perm_inv;
1605 sorting_perm, sorting_perm_inv,
1606 nb_types, type_first, type_len);
1609 for (i = 0; i < nb_types; i++) {
1612 a = the_vec_sorted[f];
1613 ost << a <<
"^" << l;
1614 if (i < nb_types - 1)
1620 nb_types, type_first, type_len);
1629 int f_backwards,
int *the_vec_sorted,
1630 int nb_types,
int *type_first,
int *type_len)
1634 f_backwards, the_vec_sorted, nb_types, type_first, type_len);
1639 int f_backwards,
int *the_vec_sorted,
1640 int nb_types,
int *type_first,
int *type_len)
1645 for (i = nb_types - 1; i >= 0; i--) {
1648 a = the_vec_sorted[f];
1651 sstr <<
"^{" << l <<
"}";
1658 for (i = 0; i < nb_types; i++) {
1661 a = the_vec_sorted[f];
1664 sstr <<
"^{" << l <<
"}";
1666 if (i < nb_types - 1)
1673 int f_backwards,
int *the_vec_sorted,
1674 int nb_types,
int *type_first,
int *type_len)
1679 for (i = nb_types - 1; i >= 0; i--) {
1682 a = the_vec_sorted[f];
1692 for (i = 0; i < nb_types; i++) {
1695 a = the_vec_sorted[f];
1700 if (i < nb_types - 1)
1707 int f_backwards,
int *the_vec_sorted,
1708 int nb_types,
int *type_first,
int *type_len)
1713 for (i = nb_types - 1; i >= 0; i--) {
1716 a = the_vec_sorted[f];
1719 ost <<
"^{" << l <<
"}";
1730 for (i = 0; i < nb_types; i++) {
1733 a = the_vec_sorted[f];
1736 ost <<
"^{" << l <<
"}";
1741 if (i < nb_types - 1)
1749 int f_backwards,
int *the_vec_sorted,
1750 int nb_types,
int *type_first,
int *type_len)
1755 for (i = nb_types - 1; i >= 0; i--) {
1758 a = the_vec_sorted[f];
1761 ost <<
"^{" << l <<
"}";
1772 for (i = 0; i < nb_types; i++) {
1775 a = the_vec_sorted[f];
1778 ost <<
"^{" << l <<
"}";
1783 if (i < nb_types - 1)
1791 int (*compare_func)(
void *v1,
void *v2))
1797 entry_size_in_chars, compare_func);
1798 for (end = len - 1; end > 0; ) {
1802 entry_size_in_chars, compare_func);
1807 int (*compare_func)(
void *data,
1808 int i,
int j,
void *extra_data),
1809 void (*swap_func)(
void *data,
1810 int i,
int j,
void *extra_data),
1817 compare_func, swap_func, extra_data);
1818 for (end = len - 1; end > 0; ) {
1819 (*swap_func)(data, 0, end, extra_data);
1823 compare_func, swap_func, extra_data);
1828 int (*compare_func)(
void *data,
1829 int i,
int j,
void *extra_data),
1830 void (*swap_func)(
void *data,
1831 int i,
int j,
void *extra_data),
1839 compare_func, swap_func, extra_data);
1840 for (end = len - 1; end > 0; ) {
1841 (*swap_func)(data, 0, end, extra_data);
1846 compare_func, swap_func, extra_data);
1853 void *search_object,
int &idx,
1854 int (*compare_func)(
void *data,
int i,
1855 void *search_object,
void *extra_data),
1856 void *extra_data,
int verbose_level)
1863 int f_v = (verbose_level >= 1);
1865 int f_found =
FALSE;
1868 cout <<
"search_general len = " << len << endl;
1888 cout <<
"search_general l=" << l <<
" m=" << m
1889 <<
" r=" << r << endl;
1891 res = (*compare_func)(data, m, search_object, extra_data);
1893 cout <<
"search_general l=" << l <<
" m=" << m
1894 <<
" r=" << r <<
" res=" << res << endl;
1902 cout <<
"l=" << l <<
" r=" << r<<
" m=" << m
1903 <<
" res=" << res << endl;
1915 cout <<
"moving to the right" << endl;
1923 cout <<
"moving to the left" << endl;
1946 for (end = len - 1; end > 0; ) {
1959 for (end = len - 1; end > 0; ) {
1972 for (end = len - 1; end > 0; ) {
1986 for (end = len - 1; end > 0; ) {
1999 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2008 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2017 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2026 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2032 int (*compare_func)(
void *v1,
void *v2))
2037 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2039 entry_size_in_chars, compare_func);
2044 int (*compare_func)(
void *data,
int i,
int j,
void *extra_data),
2045 void (*swap_func)(
void *data,
int i,
int j,
void *extra_data),
2051 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2053 compare_func, swap_func, extra_data);
2058 int (*compare_func)(
void *data,
int i,
int j,
void *extra_data),
2059 void (*swap_func)(
void *data,
int i,
int j,
void *extra_data),
2065 for (start = (len - 2) >> 1 ; start >= 0; start--) {
2067 compare_func, swap_func, extra_data);
2076 while (2 * root + 1 <= end) {
2077 child = 2 * root + 1;
2078 if (child + 1 <= end && v[child] < v[child + 1]) {
2081 if (v[root] < v[child]) {
2096 while (2 * root + 1 <= end) {
2097 child = 2 * root + 1;
2098 if (child + 1 <= end && v[child] < v[child + 1]) {
2101 if (v[root] < v[child]) {
2112 int *v,
int *w,
int start,
int end)
2117 while (2 * root + 1 <= end) {
2118 child = 2 * root + 1;
2119 if (child + 1 <= end && v[child] < v[child + 1]) {
2122 if (v[root] < v[child]) {
2134 long int *v,
long int *w,
int start,
int end)
2136 long int root, child;
2139 while (2 * root + 1 <= end) {
2140 child = 2 * root + 1;
2141 if (child + 1 <= end && v[child] < v[child + 1]) {
2144 if (v[root] < v[child]) {
2156 void *v,
int start,
int end,
int entry_size_in_chars,
2157 int (*compare_func)(
void *v1,
void *v2))
2159 char *V = (
char *) v;
2164 while (2 * root + 1 <= end) {
2165 child = 2 * root + 1;
2166 if (child + 1 <= end) {
2168 c = (*compare_func)(
2169 V + child * entry_size_in_chars,
2170 V + (child + 1) * entry_size_in_chars);
2176 c = (*compare_func)(
2177 V + root * entry_size_in_chars,
2178 V + child * entry_size_in_chars);
2190 int (*compare_func)(
void *data,
int i,
int j,
void *extra_data),
2191 void (*swap_func)(
void *data,
int i,
int j,
void *extra_data),
2198 while (2 * root + 1 <= end) {
2199 child = 2 * root + 1;
2200 if (child + 1 <= end) {
2202 c = (*compare_func)(data, child, child + 1, extra_data);
2208 c = (*compare_func)(data, root, child, extra_data);
2210 (*swap_func)(data, root, child, extra_data);
2221 int (*compare_func)(
void *data,
int i,
int j,
void *extra_data),
2222 void (*swap_func)(
void *data,
int i,
int j,
void *extra_data),
2230 while (2 * root + 1 <= end) {
2231 child = 2 * root + 1;
2232 if (child + 1 <= end) {
2234 c = (*compare_func)(data, child, child + 1, extra_data);
2240 c = (*compare_func)(data, root, child, extra_data);
2242 (*swap_func)(data, root, child, extra_data);
2277 I = i * entry_size_in_chars;
2278 J = j * entry_size_in_chars;
2280 for (h = 0; h < entry_size_in_chars; h++) {
2282 V[I + h] = V[J + h];
2289 int *data,
int data_sz,
int multiplicity,
2290 int *&pts,
int &nb_pts)
2300 for (i = 0; i < len; i++) {
2301 for (j = i + 1; j < len; j++) {
2317 for (i = 0; i < len; i++) {
2330 for (i = 0; i < len; i++) {
2340 int n,
int *pts,
int *prev,
int f_prev_is_point_index,
int *pts_inv,
2341 int *&depth,
int *&ancestor,
int verbose_level)
2343 int f_v = (verbose_level >= 1);
2347 cout <<
"sorting::schreier_vector_compute_depth_and_ancestor" << endl;
2352 for (i = 0; i < n; i++) {
2356 for (i = 0; i < n; i++) {
2358 cout <<
"sorting::schreier_vector_compute_depth_and_ancestor i=" << i <<
" / " << n << endl;
2361 pts, prev, f_prev_is_point_index, pts_inv, depth, ancestor, i);
2364 cout <<
"sorting::schreier_vector_compute_depth_and_ancestor done" << endl;
2370 int n,
int *pts,
int *prev,
int f_use_pts_inv,
int *pts_inv,
2371 int *depth,
int *ancestor,
int pos)
2375 if (f_use_pts_inv) {
2379 ancestor[pos] = pts[pos];
2382 pt_loc = pts_inv[pt];
2388 ancestor[pos] = pts[pos];
2394 cout <<
"schreier_vector_determine_depth_recursion, "
2395 "fatal: did not find pt" << endl;
2396 cout <<
"pt = " << pt << endl;
2397 cout <<
"vector of length " << n << endl;
2400 cout <<
"i : pts[i] : prev[i] : depth[i] : ancestor[i]" << endl;
2401 for (i = 0; i < n; i++) {
2403 << setw(5) << i <<
" : "
2404 << setw(5) << pts[i] <<
" : "
2405 << setw(5) << prev[i] <<
" : "
2407 << setw(5) << depth[i] <<
" : "
2408 << setw(5) << ancestor[i]
2420 pts, prev, f_use_pts_inv, pts_inv,
2421 depth, ancestor, pt_loc) + 1;
2424 ancestor[pos] = ancestor[pt_loc];
2429 int n,
int *pts,
int *prev,
int f_use_pts_inv,
int *pts_inv,
2430 std::string &fname_base,
2435 int f_v = (verbose_level >= 1);
2441 cout <<
"sorting::schreier_vector_tree, n=" << n <<
" f_use_pts_inv=" << f_use_pts_inv << endl;
2445 if (f_use_pts_inv) {
2446 cout <<
"i : pts[i] : pts_inv[i] : prev[i]" << endl;
2447 for (i = 0; i < n; i++) {
2448 cout << i <<
" : " << pts[i] <<
" : " << pts_inv[i] <<
" : " << prev[i] << endl;
2452 cout <<
"i : pts[i] : prev[i]" << endl;
2453 for (i = 0; i < n; i++) {
2454 cout << i <<
" : " << pts[i] <<
" : " << prev[i] << endl;
2461 cout <<
"sorting::schreier_vector_tree before schreier_vector_compute_depth_and_ancestor" << endl;
2464 n, pts, prev, f_use_pts_inv, pts_inv,
2465 depth, ancestor, verbose_level - 2);
2467 cout <<
"sorting::schreier_vector_tree after schreier_vector_compute_depth_and_ancestor" << endl;
2471 cout <<
"i : pts[i] : prev[i] : depth[i]" << endl;
2472 for (i = 0; i < n; i++) {
2473 cout << i <<
" : " << pts[i] <<
" : " << prev[i] <<
" : " << depth[i] << endl;
2478 for (i = 0; i < n; i++) {
2483 if (ancestor[i] != r) {
2484 cout <<
"sorting::schreier_vector_tree the tree is not a tree but a forest" << endl;
2500 nb_types, verbose_level);
2504 cout <<
"sorting::schreier_vector_tree SoS=" << endl;
2517 fname_base, verbose_level);
2522 int pos1, pos2, d1, d2, n1, n2;
2524 for (i = 0; i < n; i++) {
2527 cout <<
"sorting::schreier_vector_tree i=" << i <<
" / " << n << endl;
2530 if (depth[i] == 0) {
2534 cout <<
"sorting::schreier_vector_tree i=" << i <<
" / " << n <<
" pos2=" << pos2 << endl;
2537 if (f_use_pts_inv) {
2548 cout <<
"sorting::schreier_vector_tree cannot find point pt" << endl;
2553 cout <<
"sorting::schreier_vector_tree i=" << i <<
" / " << n <<
" pos2=" << pos2 <<
" pos1=" << pos1 << endl;
2558 cout <<
"sorting::schreier_vector_tree cannot find point pos1" << endl;
2562 cout <<
"sorting::schreier_vector_tree cannot find point pos2" << endl;
2568 for (i = 0; i < n; i++) {
2572 cout <<
"sorting::schreier_vector_tree cannot find point pos1" << endl;
2583 cout <<
"sorting::schreier_vector_tree before LG->place" << endl;
2587 cout <<
"sorting::schreier_vector_tree after LG->place" << endl;
2590 cout <<
"sorting::schreier_vector_tree before LG->create_spanning_tree" << endl;
2593 TRUE , verbose_level);
2595 cout <<
"sorting::schreier_vector_tree after LG->create_spanning_tree" << endl;
2601 fname.assign(fname_base);
2602 fname.append(
".layered_graph");
2612 cout <<
"sorting::schreier_vector_tree done" << endl;
2628 for ( u = 0; u < sz1 + sz2; u++) {
2629 if (u < sz1 && u < sz2) {
2630 if (S1[u] < S2[u]) {
2634 else if (S1[u] > S2[u]) {
2648 else if (u == sz2) {
2671 for (u = 0; u < sz1 + sz2; u++) {
2672 if (u < sz1 && u < sz2) {
2673 if (S1[u] < S2[u]) {
2677 else if (S1[u] > S2[u]) {
2691 else if (u == sz2) {
2708 while (u < sz1 && v < sz2) {
2709 if (set1[u] == set2[v]) {
2712 else if (set1[u] < set2[v]) {
2725 int l, r, m, len, m1, pivot;
2730 len = right + 1 - left;
2735 v[pivot] = v[left + m1];
2744 if (v[l] < v[pivot])
2751 if (v[r] >= v[pivot])
2800 while (u + v < sz) {
2807 else if (v == sz2) {
2810 else if (p[u] < q[v]) {
2821 long int *set1,
long int *set2,
int sz1,
int sz2)
2831 while (u + v < sz) {
2838 else if (v == sz2) {
2841 else if (p[u] < q[v]) {
2855 for (i = 0; i < len; i++) {
2869 for (i = 0; i < len; i++) {
2882 for (i = 0; i < len; i++) {
2895 for (i = 0; i < len; i++) {
2896 if (p[i * stride] < q[i * stride])
2898 if (p[i * stride] > q[i * stride])
2905 int *class_first,
int *class_len,
int &nb_classes)
2913 for (i = 1; i < len; i++) {
2914 if (v[i] == v[i - 1]) {
2915 class_len[nb_classes]++;
2919 class_first[nb_classes] =
2920 class_first[nb_classes - 1] + class_len[nb_classes - 1];
2921 class_len[nb_classes] = 1;
2931static void int_vec_partition(
int *v,
2932 int (*compare_func)(
int a,
int b),
int left,
int right,
int *middle)
2934 int l, r, m, len, m1, res, pivot;
2939 len = right + 1 - left;
2944 v[pivot] = v[left + m1];
2953 res = (*compare_func)(v[l], v[pivot]);
2961 res = (*compare_func)(v[r], v[pivot]);
2982static void lint_vec_partition(
long int *v,
2983 int (*compare_func)(
long int a,
long int b),
int left,
int right,
int *middle)
2986 int len, m1, res, pivot;
2991 len = right + 1 - left;
2996 v[pivot] = v[left + m1];
3005 res = (*compare_func)(v[l], v[pivot]);
3013 res = (*compare_func)(v[r], v[pivot]);
3034static void partition(
void **v,
int *perm,
3035 int (*compare_func)(
void *a,
void *b,
void *data),
void *data,
3036 int left,
int right,
int *middle)
3038 int l, r, m, len, m1, res, pivot, tmp;
3043 len = right + 1 - left;
3048 v[pivot] = v[left + m1];
3053 perm[pivot] = perm[left + m1];
3054 perm[left + m1] = tmp;
3063 res = (*compare_func)(v[l], v[pivot], data);
3071 res = (*compare_func)(v[r], v[pivot], data);
3095 perm[left] = perm[m];
3102static void quicksort(
void **v,
int *perm,
3103 int (*compare_func)(
void *a,
void *b,
void *data),
void *data,
3104 int left,
int right)
3109 partition(v, perm, compare_func, data, left, right, &middle);
3110 quicksort(v, perm, compare_func, data, left, middle - 1);
3111 quicksort(v, perm, compare_func, data, middle + 1, right);
3115static int compare_increasingly_int(
int a,
int b)
3124static int compare_decreasingly_int(
int a,
int b)
3133static int compare_increasingly_lint(
long int a,
long int b)
3142static int compare_decreasingly_lint(
long int a,
long int b)
a collection of combinatorial functions
void perm_inverse(int *a, int *b, long int n)
catch all class for algorithms
void int_swap(int &x, int &y)
void sort_all(int verbose_level)
a collection of functions related to sorted vectors
int int_vec_search_first_occurence(int *v, int len, int a, int &idx, int verbose_level)
void int_vec_values_and_multiplicities(int *v, int l, int *&val, int *&mult, int &nb_values)
int int_vec_compare_stride(int *p, int *q, int len, int stride)
void heapsort_make_heap(int *v, int len)
void lint_vec_search_vec_linear(long int *v, int len, long int *A, int A_sz, long int *Idx)
void lint_vec_quicksort_increasingly(long int *v, int len)
int int_vec_search(int *v, int len, int a, int &idx)
void heapsort_sift_down_with_log(int *v, int *w, int start, int end)
void int_vec_sort_and_remove_duplicates(int *v, int &len)
void Heapsort_general_sift_down_with_log(void *data, int *w, int start, int end, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
int int_vec_is_zero(int *v, int len)
int lint_vec_search_linear(long int *v, int len, long int a, int &idx)
void int_vec_heapsort(int *v, int len)
void lint_vec_intersect_sorted_vectors(long int *v1, int len1, long int *v2, int len2, long int *v3, int &len3)
void heapsort_sift_down(int *v, int start, int end)
void lint_heapsort_make_heap(long int *v, int len)
int vec_search_general(void *vec, int(*compare_func)(void *vec, void *a, int b, void *data_for_compare), void *data_for_compare, int len, void *a, int &idx, int verbose_level)
void int_vec_intersect(int *v1, int len1, int *v2, int len2, int *&v3, int &len3)
int vector_lint_search(std::vector< long int > &v, long int a, int &idx, int verbose_level)
void int_vec_sorting_permutation(int *v, int len, int *perm, int *perm_inv, int f_increasingly)
int int_vec_is_sorted(int *v, int len)
int test_if_sets_are_disjoint_assuming_sorted_lint(long int *set1, long int *set2, int sz1, int sz2)
void sorted_vec_get_first_and_length(int *v, int len, int *class_first, int *class_len, int &nb_classes)
int integer_vec_compare(int *p, int *q, int len)
int test_if_set_with_return_value_lint(long int *set, int set_size)
void Heapsort_general_make_heap(void *data, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
int schreier_vector_determine_depth_recursion(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, int *depth, int *ancestor, int pos)
int test_if_sets_are_disjoint(long int *set1, int sz1, long int *set2, int sz2)
int int_vec_sort_and_test_if_contained(int *v1, int len1, int *v2, int len2)
void int_vec_print_classified(std::ostream &ost, int *vec, int len)
void Heapsort_sift_down(void *v, int start, int end, int entry_size_in_chars, int(*compare_func)(void *v1, void *v2))
int lint_vec_compare(long int *p, long int *q, int len)
void int_vec_search_vec(int *v, int len, int *A, int A_sz, int *Idx)
void int_vec_swap_points(int *list, int *list_inv, int idx1, int idx2)
int lint_vecs_find_common_element(long int *v1, int len1, long int *v2, int len2, int &idx1, int &idx2)
int lint_vec_sort_and_test_if_contained(long int *v1, int len1, long int *v2, int len2)
void int_vec_heapsort_with_log(int *v, int *w, int len)
void rearrange_subset_lint(int n, int k, long int *set, int *subset, long int *rearranged_set, int verbose_level)
int int_vecs_find_common_element(int *v1, int len1, int *v2, int len2, int &idx1, int &idx2)
void int_vec_classify(int length, int *the_vec, int *&the_vec_sorted, int *&sorting_perm, int *&sorting_perm_inv, int &nb_types, int *&type_first, int *&type_len)
void Heapsort_general_sift_down(void *data, int start, int end, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
void int_vec_quicksort_increasingly(int *v, int len)
void int_vec_print_types_naked_tex_we_are_in_math_mode(std::ostream &ost, int f_backwards, int *the_vec_sorted, int nb_types, int *type_first, int *type_len)
void Heapsort_general(void *data, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
int int_vecs_are_disjoint(int *v1, int len1, int *v2, int len2)
int test_if_set_with_return_value(int *set, int set_size)
void int_vec_classify_and_print(std::ostream &ost, int *v, int l)
void d_quicksort_array(int len, double *v)
int uchar_vec_compare(uchar *p, uchar *q, int len)
void int_vec_print_types_naked_stringstream(std::stringstream &sstr, int f_backwards, int *the_vec_sorted, int nb_types, int *type_first, int *type_len)
void heapsort_make_heap_with_log(int *v, int *w, int len)
void int_vec_classify_with_arrays(int length, int *the_vec, int *the_vec_sorted, int *sorting_perm, int *sorting_perm_inv, int &nb_types, int *type_first, int *type_len)
void int_vec_bubblesort_increasing(int len, int *p)
void int_vec_quicksort(int *v, int(*compare_func)(int a, int b), int left, int right)
void int_vec_print_types(std::ostream &ost, int f_backwards, int *the_vec_sorted, int nb_types, int *type_first, int *type_len)
void lint_vec_heapsort_with_log(long int *v, long int *w, int len)
void d_quicksort(double *v, int left, int right)
void Heapsort_general_with_log(void *data, int *w, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
int int_vec_is_subset_of(int *set, int sz, int *big_set, int big_set_sz)
void d_partition(double *v, int left, int right, int *middle)
int int_vec_search_linear(int *v, int len, int a, int &idx)
void Heapsort(void *v, int len, int entry_size_in_chars, int(*compare_func)(void *v1, void *v2))
void heapsort_swap(int *v, int i, int j)
int longinteger_vec_search(ring_theory::longinteger_object *v, int len, ring_theory::longinteger_object &a, int &idx)
int int_vec_search_and_remove_if_found(int *v, int &len, int a)
void quicksort_array(int len, void **v, int(*compare_func)(void *a, void *b, void *data), void *data)
void int_vec_append_and_reallocate_if_necessary(int *&vec, int &used_length, int &alloc_length, int a, int verbose_level)
void lint_vec_sort_and_remove_duplicates(long int *v, int &len)
void Heapsort_general_make_heap_with_log(void *data, int *w, int len, int(*compare_func)(void *data, int i, int j, void *extra_data), void(*swap_func)(void *data, int i, int j, void *extra_data), void *extra_data)
void int_vec_search_vec_linear(int *v, int len, int *A, int A_sz, int *Idx)
void vec_intersect(long int *v1, int len1, long int *v2, int len2, long int *&v3, int &len3)
void rearrange_subset_lint_all(int n, int k, long int *set, long int *subset, long int *rearranged_set, int verbose_level)
void int_vec_multiplicities(int *v, int l, int *&w, int &w_len)
void lint_vec_quicksort(long int *v, int(*compare_func)(long int a, long int b), int left, int right)
void schreier_vector_compute_depth_and_ancestor(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, int *&depth, int *&ancestor, int verbose_level)
void quicksort_array_with_perm(int len, void **v, int *perm, int(*compare_func)(void *a, void *b, void *data), void *data)
void int_vec_values(int *v, int l, int *&w, int &w_len)
int vec_search(void **v, int(*compare_func)(void *a, void *b, void *data), void *data_for_compare, int len, void *a, int &idx, int verbose_level)
void lint_heapsort_swap(long int *v, int i, int j)
void test_if_set(int *set, int set_size)
void lint_vec_search_vec(long int *v, int len, long int *A, int A_sz, long int *Idx)
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
void find_points_by_multiplicity(int *data, int data_sz, int multiplicity, int *&pts, int &nb_pts)
void Heapsort_swap(void *v, int i, int j, int entry_size_in_chars)
int test_if_sets_are_equal(int *set1, int *set2, int set_size)
void lint_vec_quicksort_decreasingly(long int *v, int len)
int search_general(void *data, int len, void *search_object, int &idx, int(*compare_func)(void *data, int i, void *search_object, void *extra_data), void *extra_data, int verbose_level)
int test_if_sets_are_disjoint_assuming_sorted(int *set1, int *set2, int sz1, int sz2)
void lint_heapsort_sift_down(long int *v, int start, int end)
int int_vec_search_and_insert_if_necessary(int *v, int &len, int a)
int test_if_sets_are_disjoint_not_assuming_sorted(long int *v, long int *w, int len)
void rearrange_subset(int n, int k, int *set, int *subset, int *rearranged_set, int verbose_level)
void int_vec_quicksort_decreasingly(int *v, int len)
int int_vec_compare(int *p, int *q, int len)
void int_vec_intersect_sorted_vectors(int *v1, int len1, int *v2, int len2, int *v3, int &len3)
void lint_vec_heapsort(long int *v, int len)
void int_vec_print_types_naked_tex(std::ostream &ost, int f_backwards, int *the_vec_sorted, int nb_types, int *type_first, int *type_len)
void lint_heapsort_make_heap_with_log(long int *v, long int *w, int len)
void schreier_vector_tree(int n, int *pts, int *prev, int f_use_pts_inv, int *pts_inv, std::string &fname_base, graphics::layered_graph_draw_options *LG_Draw_options, graph_theory::layered_graph *&LG, int verbose_level)
int compare_sets_lint(long int *set1, long int *set2, int sz1, int sz2)
void int_vec_insert_and_reallocate_if_necessary(int *&vec, int &used_length, int &alloc_length, int a, int verbose_level)
void lint_vec_append_and_reallocate_if_necessary(long int *&vec, int &used_length, int &alloc_length, long int a, int verbose_level)
int compare_sets(int *set1, int *set2, int sz1, int sz2)
void lint_heapsort_sift_down_with_log(long int *v, long int *w, int start, int end)
int lint_vec_is_subset_of(int *set, int sz, long int *big_set, int big_set_sz, int verbose_level)
void int_vec_print_types_naked(std::ostream &ost, int f_backwards, int *the_vec_sorted, int nb_types, int *type_first, int *type_len)
void int_vec_sorted_collect_types(int length, int *the_vec_sorted, int &nb_types, int *type_first, int *type_len)
void Heapsort_make_heap(void *v, int len, int entry_size_in_chars, int(*compare_func)(void *v1, void *v2))
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
data_structures::set_of_sets * get_set_partition_and_types(int *&types, int &nb_types, int verbose_level)
void print_file(std::ostream &ost, int f_backwards)
void get_data_by_multiplicity(int *&Pts, int &nb_pts, int multiplicity, int verbose_level)
a data structure to store layered graphs or Hasse diagrams
void draw_with_options(std::string &fname, graphics::layered_graph_draw_options *O, int verbose_level)
void write_file(std::string &fname, int verbose_level)
void add_node_data1(int l, int n, int data, int verbose_level)
void init(int nb_layers, int *Nb_nodes_layer, std::string &fname_base, int verbose_level)
void create_spanning_tree(int f_place_x, int verbose_level)
void place_with_y_stretch(double y_stretch, int verbose_level)
void add_edge(int l1, int n1, int l2, int n2, int verbose_level)
options for drawing an object of type layered_graph
domain to compute with objects of type longinteger
int compare(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
#define Lint_vec_copy(A, B, C)
#define Lint_vec_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects