Существует и не требует, чтобы элементы имели порядок.
Чтобы быть формальным, мы имеем дело с мультимножествами (также называемыми мешками .) В следующем случае для мультимножества S :
Элемент m большинства S , если он существует, является тем элементом, что 2 v ( m ; S )> #S .
Назовем L и R a расщепление S , если L ⊕ R = S и четное расщепление , если | #L - #R | ≤ 1. То есть, если n = #S четно, L и R имеют ровно половину элементов из S , и если n нечетно, чем один имеет мощность [ n / 2], а другой имеет мощность [ n /2]+1.
Для произвольного раскола S на L и R два наблюдения :
Алгоритм majo rity ( S ) ниже возвращает либо пару ( m , k ), указывая, что m является элементом большинства с k вхождения или none :
Обратите внимание, что алгоритм по-прежнему корректен, даже если split не является четным. Разделение равномерно, хотя, скорее всего, будет лучше работать на практике.
Добавление
Сделал вывод в терминале явным в описании алгоритма выше. Пример кода C ++:
struct majority_t {
int m; // majority element
size_t k; // multiplicity of m; zero => no majority element
constexpr majority_t(): m(0), k(0) {}
constexpr majority_t(int m_,size_t k_): m(m_), k(k_) {}
explicit operator bool() const { return k>0; }
};
static constexpr majority_t no_majority;
size_t multiplicity(int x,const int *arr,size_t n) {
if (n==0) return 0;
else if (n==1) return arr[0]==x?1:0;
size_t r=n/2;
return multiplicity(x,arr,r)+multiplicity(x,arr+r,n-r);
}
majority_t majority(const int *arr,size_t n) {
if (n==0) return no_majority;
else if (n==1) return majority_t(arr[0],1);
size_t r=n/2;
majority_t left=majority(arr,r);
if (left) {
left.k+=multiplicity(left.m,arr+r,n-r);
if (left.k>r) return left;
}
majority_t right=majority(arr+r,n-r);
if (right) {
right.k+=multiplicity(right.m,arr,r);
if (right.k>r) return right;
}
return no_majority;
}
Предположим, что вы вошли в свой контейнер и пытаетесь «перезагрузить» контейнер:
например. docker run -i -t centos /bin/bash
, а затем reboot
Вы не должны делать это.
Пожалуйста, используйте docker run/start/stop...
.
Почему вы хотите перезапустить контейнер?
, если необходимо, вы можете использовать docker exec -it <container name> reboot
или вы можете остановить контейнер и запустить его снова docker stop -f <container name>
, затем docker start <container name>