set
. Тя ще представлява множество от елементи, като ще можем да добавяме и премахваме числа, да питаме дали дадено число се съдържа в множеството, и да питаме колко елемента има в множеството. Като допълнителна функционалност към стандартния set
, нашата структура данни ще може да отговаря (много бързо) на въпроса "кой е k-тият по големина елемент".const int MAX_SIZE = 1048576;
int setSize;
int setValues[MAX_SIZE];
O(1)
.
int getSize() {
return setSize;
}
O(1)
.
int getKth(int k) {
if (k >= 0 && k < setSize)
return setValues[k];
// Невалиден индекс
fprintf(stderr, "ERROR: Invalid index %d!\n", k);
return -1;
}
O(log(N))
.
int find(int val) {
int left = 0, right = setSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (setValues[mid] == val)
return mid;
if (setValues[mid] < val)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
O(N)
.
void insert(int val) {
int idx = find(val);
// Ако елементът вече е в множеството сме готови
if (idx != -1)
return;
// В противен случай го добавяме накрая и го завлачваме до мястото му
setValues[setSize++] = val;
for (int i = setSize - 1; i > 0; i--) {
if (setValues[i - 1] < setValues[i])
break;
swap(setValues[i - 1], setValues[i]);
}
}
O(N)
.
void erase(int val) {
int idx = find(val);
// Ако елементът не е в множеството сме готови
if (idx == -1)
return;
// В противен случай го изтриваме и донаместваме останалите елемнети
for (int i = idx; i < setSize - 1; i++)
setValues[i] = setValues[i + 1];
setSize--;
}
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_SIZE = 1048576;
int setSize;
int setValues[MAX_SIZE];
int getSize() {
return setSize;
}
int getKth(int k) {
if (k >= 0 && k < setSize)
return setValues[k];
// Невалиден индекс
return -1;
}
int find(int val) {
int left = 0, right = setSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (setValues[mid] == val)
return mid;
if (setValues[mid] < val)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
void insert(int val) {
int idx = find(val);
// Ако елементът вече е в множеството сме готови
if (idx != -1)
return;
// В противен случай го добавяме накрая и го завлачваме до мястото му
setValues[setSize++] = val;
for (int i = setSize - 1; i > 0; i--) {
if (setValues[i - 1] < setValues[i])
break;
swap(setValues[i - 1], setValues[i]);
}
}
void erase(int val) {
int idx = find(val);
// Ако елементът не е в множеството сме готови
if (idx == -1)
return;
// В противен случай го изтриваме и донаместваме останалите елемнети
for (int i = idx; i < setSize - 1; i++)
setValues[i] = setValues[i + 1];
setSize--;
}
int main(void) {
int a[8] = {42, 13, 42, 666, 1337, 17, 42, 69};
for (int i = 0; i < 8; i++)
insert(a[i]);
for (int i = -1; i <= 10; i++)
fprintf(stdout, "%dth element is: %d\n", i, getKth(i));
for (int i = 0; i < 20; i++)
fprintf(stdout, "Found number %d at position: %d\n", i, find(i));
return 0;
}
Selected text (if you see this, there is something wrong)
(Незадължително) E-mail за обратна връзка: