数据结构与算法学习(8)
一.前缀树
struct TrieNode
{
int pass;
int end;
unordered_map<char, TrieNode*> nexts;
TrieNode() :pass(0), end(0) {}
};
struct Trie
{
private:
TrieNode* root;
public:
Trie()
{
root = new TrieNode();
}
void Insert(string val) {
TrieNode* node = root;
node->pass++;
for (auto c : val)
{
if (node->nexts.count(c) <= 0)
node->nexts[c] = new TrieNode();
node = node->nexts[c];
node->pass++;
}
node->end++;
}
int Search(string val) {
TrieNode* node = root;
for (auto c : val) {
if (node->nexts.count(c) <= 0)
return 0;
node = node->nexts[c];
}
return node->end;
}
int PrefixNumbers(string val) {
TrieNode* node = root;
for (auto c : val) {
if (node->nexts.count(c) <= 0)
return 0;
node = node->nexts[c];
}
return node->pass;
}
void Delete(string val) {
if (Search(val) <= 0)return;
TrieNode* node = root;
for (int i = 0; i < val.size(); i++) {
char c = val[i];
if (--node->nexts[c]->pass == 0) {
TrieNode* tmp = node->nexts[c];
for (int j = i + 1; j < val.size(); j++) {
TrieNode* t = tmp;
tmp = t->nexts[val[j]];
delete t;
t = nullptr;
}
delete tmp;
tmp = nullptr;
node->nexts.erase(c);
return;
}
node = node->nexts[c];
}
node->end--;
}
};
二.贪心算法
1.安排会议问题
bool comparator(const Program& a, const Program& b)
{
return (a.end < b.end);
}
int Test02(vector<Program>& arr, int startTime) {
sort(arr.begin(), arr.end(), comparator);
int result = 0;
for (int i = 0; i < arr.size(); i++)
{
if (arr[i].start >= startTime) {
startTime = arr[i].end;
result++;
}
}
return result;
}
2.最低字典序结合字符串
bool comparator1(const string& a, const string& b) {
return (a + b).compare((b + a));
}
string Test03(vector<string>& arr) {
sort(arr.begin(), arr.end(), comparator1);
string result;
for (int i = 0; i < arr.size(); i++)
result.append(arr[i]);
return result;
}
3.最大利润问题
int Test01(int k, int m, vector<int>& chengBenArr, vector<int>& liRunArr) {
priority_queue<Node*, vector<Node*>, F1> q1;
priority_queue<Node*, vector<Node*>, F2> q2;
for (int i = 0; i < chengBenArr.size(); i++)
q1.push(new Node(chengBenArr[i], liRunArr[i]));
for (int i = 0; i < k; i++)
{
while (!q1.empty() && q1.top()->chengBen <= m)
{
q2.push(q1.top());
q1.pop();
}
if (q2.empty())
return m;
m += q2.top()->liRun;
q2.pop();
}
return m;
}
三.堆补充
1.给定数据流,寻找中位数
float Test02(vector<int>& arr) {
priority_queue<int, vector<int>, less<int>> maxQ;
priority_queue<int, vector<int>, greater<int>> minQ;
maxQ.push(arr[0]);
for (int i = 1; i < arr.size(); i++)
{
if (arr[i] <= maxQ.top())
maxQ.push(arr[i]);
else
minQ.push(arr[i]);
int a = maxQ.size() - minQ.size();
int b = minQ.size() - maxQ.size();
if (a >= 2) {
minQ.push(maxQ.top());
maxQ.pop();
}
else if (b >= 2) {
maxQ.push(minQ.top());
minQ.pop();
}
}
if ((maxQ.size() + minQ.size()) % 2 == 0) {
return (maxQ.top() + minQ.top()) / 2.0f;
}
else {
return maxQ.top();
}
}
四.八皇后问题
bool IsOk(int arr[], int i, int j) {
for (int k = 0; k < i; k++)
{
if (arr[k] == j || (abs(arr[k] - j) == abs(i - k)))
return false;
}
return true;
}
int Process(int i, int arr[], int n) {
if (i == n)
return 1;
int res = 0;
for (int j = 0; j < n; j++)
{
if (IsOk(arr, i, j)) {
arr[i] = j;
res += Process(i + 1, arr, n);
}
}
return res;
}
int Test03(int n) {
int* arr = new int[n];
return Process(0, arr, n);
}