diff options
author | max42 <max42@yandex-team.com> | 2023-06-30 03:37:03 +0300 |
---|---|---|
committer | max42 <max42@yandex-team.com> | 2023-06-30 03:37:03 +0300 |
commit | fac2bd72b4b31ec3238292caf8fb2a8aaa6d6c4a (patch) | |
tree | b8cbc1deb00309c7f1a7ab6df520a76cf0b5c6d7 /library/cpp/disjoint_sets/disjoint_sets.h | |
parent | 7bf166b1a7ed0af927f230022b245af618e998c1 (diff) | |
download | ydb-fac2bd72b4b31ec3238292caf8fb2a8aaa6d6c4a.tar.gz |
YT-19324: move YT provider to ydb/library/yql
This commit is formed by the following script: https://paste.yandex-team.ru/6f92e4b8-efc5-4d34-948b-15ee2accd7e7/text.
This commit has zero effect on all projects that depend on YQL.
The summary of changes:
- `yql/providers/yt -> ydb/library/yql/providers/yt `- the whole implementation of YT provider is moved into YDB code base for further export as a part of YT YQL plugin shared library;
- `yql/providers/stat/{expr_nodes,uploader} -> ydb/library/yql/providers/stat/{expr_nodes,uploader}` - a small interface without implementation and the description of stat expr nodes;
- `yql/core/extract_predicate/ut -> ydb/library/yql/core/extract_predicate/ut`;
- `yql/core/{ut,ut_common} -> ydb/library/yql/core/{ut,ut_common}`;
- `yql/core` is gone;
- `yql/library/url_preprocessing -> ydb/library/yql/core/url_preprocessing`.
**NB**: all new targets inside `ydb/` are under `IF (NOT CMAKE_EXPORT)` clause which disables them from open-source cmake generation and ya make build. They will be enabled in the subsequent commits.
Diffstat (limited to 'library/cpp/disjoint_sets/disjoint_sets.h')
-rw-r--r-- | library/cpp/disjoint_sets/disjoint_sets.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/library/cpp/disjoint_sets/disjoint_sets.h b/library/cpp/disjoint_sets/disjoint_sets.h new file mode 100644 index 0000000000..5768886704 --- /dev/null +++ b/library/cpp/disjoint_sets/disjoint_sets.h @@ -0,0 +1,81 @@ +#pragma once + +#include <util/system/yassert.h> +#include <util/generic/vector.h> + +// Implementation of disjoint-set data structure with union by rank and path compression. +// See http://en.wikipedia.org/wiki/Disjoint-set_data_structure +class TDisjointSets { +public: + using TElement = size_t; + +private: + mutable TVector<TElement> Parents; + TVector<size_t> Ranks; + TVector<size_t> Sizes; + size_t NumberOfSets; + +public: + TDisjointSets(size_t setCount) + : Parents(setCount) + , Ranks(setCount, 0) + , Sizes(setCount, 1) + , NumberOfSets(setCount) + { + for (size_t i = 0; i < setCount; ++i) + Parents[i] = i; + } + + TElement CanonicSetElement(TElement item) const { + if (Parents[item] != item) + Parents[item] = CanonicSetElement(Parents[item]); + return Parents[item]; + } + + size_t SizeOfSet(TElement item) const { + return Sizes[CanonicSetElement(item)]; + } + + size_t InitialSetCount() const { + return Parents.size(); + } + + size_t SetCount() const { + return NumberOfSets; + } + + void UnionSets(TElement item1, TElement item2) { + TElement canonic1 = CanonicSetElement(item1); + TElement canonic2 = CanonicSetElement(item2); + if (canonic1 == canonic2) + return; + + --NumberOfSets; + if (Ranks[canonic1] < Ranks[canonic2]) { + Parents[canonic1] = canonic2; + Sizes[canonic2] += Sizes[canonic1]; + } else { + Parents[canonic2] = canonic1; + Sizes[canonic1] += Sizes[canonic2]; + Ranks[canonic2] += Ranks[canonic1] == Ranks[canonic2] ? 1 : 0; + } + } + + void Expand(size_t setCount) { + if (setCount < Parents.size()) { + return; + } + + size_t prevSize = Parents.size(); + Parents.resize(setCount); + Ranks.resize(setCount); + Sizes.resize(setCount); + NumberOfSets += setCount - prevSize; + + for (size_t i = prevSize; i < setCount; ++i) { + Parents[i] = i; + Ranks[i] = 0; + Sizes[i] = 1; + } + } +}; |