严格/非严格排序,强/非强排序以及部分/全序列有什么区别?
- 严格/非严格排序:在严格排序中,如果两个元素不能被比较,则它们是等效的。在非严格排序中,如果两个元素不能被比较,则它们可以被视为相等。
- 强/非强排序:在强排序中,所有元素都可以被比较。在非强排序中,一些元素可能无法比较。
- 部分/全序列:在部分排序中,某些元素可能无法比较。在全序列中,所有元素都可以比较。
严格/非严格排序,强/非强排序以及部分/全序列有什么区别?
对于所有的 x ∈ X,我们从来没有 x < x,
每当 x < y,我们从来没有 y < x,并且
每当 x < y 和 y < z,我们就有 x < z。
集合X的适当子集,其中 A < B 意味着 A ⊊ B。
使用 a < b 表示“a整除b”的自然数。
C++中的模板特化。
示例#1:
template <typename T> struct Foo {}; // A1
template <typename U> struct Foo<U*> {}; // A2
template <> struct Foo<int*> {}; // A3
template <typename T1, typename T2> struct Bar {}; // B1
template <typename U> struct Bar<int, U> {}; // B2a
template <typename V> struct Bar<V, int> {}; // B2b
template <> struct Bar<int, int> {}; // B3
这次,我们有B3 < B2b < B1和B3 < B2a < B1,但B2a和B2b是不可比较的。
在C++中,这样表现出来:如果未定义专业化B3,则尝试实例化Bar<int,int>
将导致编译器错误,因为没有明确的“最专业”的专业化。
偏序集可以有许多“最小”元素和“最大”元素,因为这些概念只能谈论可比较的元素。在B1、B2a和B2b中,B2a和B2b都是“最小元素”,因为没有更小的元素。尽管如此,没有唯一的最小元素。
! (x < y) && ! (y < x)
定义了一个等价关系。(说到这里,我们可能应该用 <code><i>op</i></code> 替换 <
,因为并没有要求这个关系一定要写成 <
。) - James KanzeL(x) = { y in S | y<x }
I(x) = { y in S | not(y<x) and not(x<y) }
G(x) = { y in S | x<y }
L(x) : set of elements less than x
I(x) : set of elements incomparable with x
G(x) : set of elements greater than x
如果对于序列中的每个x
,L(x)
的元素首先出现在序列中,然后是I(x)
的元素,最后是G(x)
的元素,则该序列按照<
排序。
如果对于序列中的另一个元素y
出现在元素x
之后,y
不小于x
,则该序列是拓扑排序。这是比排序更弱的约束条件。
很容易证明L(x)
的每个元素都小于G(x)
的任何元素。L(x)
的元素与I(x)
的元素之间或I(x)
的元素与G(x)
的元素之间没有普遍关系。但是,如果<
是严格的弱关系,则L(x)
的每个元素都小于I(x)
的任何元素,并且I(x)
的任何元素都小于G(x)
的任何元素。
<
是一个严格的弱关系,并且x<y
,那么L(x) U I(x)
中的任何元素都小于I(y) U G(y)
中的任何元素:任何不大于x
的元素都小于任何不小于y
的元素。这在部分排序中不成立。