斯坦福 Algorithms: Design and Analysis 1 第六周作业

来自斯坦福网站的Algorithms: Design and Analysis,与目前coursera上的版本内容没有变化,不过时间安排略有不同。

1. Problem Set 6

斯坦福 算法1 第六周作业
既然是平均分配的,期望自然是直接数量乘以概率。

斯坦福 算法1 第六周作业
斯坦福 算法1 第六周作业
跟上题差不多。既然计数自然需要遍历一遍。
斯坦福 算法1 第六周作业
对于固定一个哈希函数,必然存在一些数据集会全部分配到某个位置上。
斯坦福 算法1 第六周作业

2. Optional Theory Problems

搜不到也不会做,gg。
斯坦福 算法1 第六周作业

3. Programming Assignment 6

斯坦福 算法1 第六周作业
一百万个数。然后计算-10000到10000之间的20001个数有多少个能被已知的数字组合起来。实现得感觉已经可以了,但是运行依然很慢。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <fstream>
#include <sstream>
#include <set>
#include <string>
#include <ctime>
#include <algorithm>

using namespace std;

#define INT_MAX 2147483647


void readData(string fileName,vector<long long>& v) {
    cout << "read data from "<< fileName <<endl;
    ifstream input(fileName);
    string line;
    long long u;
    if(input) {
        while(getline(input,line)) {
            istringstream ist(line);
            ist >> u;
            v.push_back(u);
        }
    }
}

bool cmp(pair<long long, int>&a, pair<long long, int>& b) {
    return a.first < b.first;
}

int count2sum(vector<long long>& v) {
    unordered_map<long long,int> mp;
    for(long long num : v)
        mp[num]++;
    cout << "start sorting ..."<<endl;
    vector<pair<long long, int>> arrays(mp.begin(),mp.end());
    sort(arrays.begin(),arrays.end(),cmp);
    cout << "sorting finish."<<endl;
    int res = 0;
    for(int i = -10000; i <= 10000; i++) {
        for(auto& p : arrays) {
            long long x = p.first;
            if(x > i) break;
            long long y = i-x;
            if(mp.find(y) != mp.end()) {
                if(x == y){
                    if(mp[x] > 1){
                        res++;
                        break;
                    }
                }
                else{
                    res++;
                    break;
                }
            }
        }
        if(i % 100 == 0)
            cout << i <<" : "<< res << endl;
    }
    return res;
}

int main() {
    vector<long long> v;
    string file = "algo1-programming_prob-2sum.txt";
    readData(file,v);
    int res = count2sum(v);
    cout << "the result is: "<< res << endl;
    return 0;
}

斯坦福 算法1 第六周作业
这个倒是不难,只不过需要注意题目中中位数的定义。以及新加入一个数的时候最大堆与最小堆保持最小堆的顶大于最大堆的顶。以及数量上的平衡。

#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <sstream>
#include <set>
#include <string>
#include <ctime>
#include <algorithm>

using namespace std;

#define INT_MAX 2147483647


void readData(string fileName,vector<int>& v) {
    cout << "read data from "<< fileName <<endl;
    ifstream input(fileName);
    string line;
    int u;
    if(input) {
        while(getline(input,line)) {
            istringstream ist(line);
            ist >> u;
            v.push_back(u);
        }
    }
}
struct cmp
{
    bool operator()(int a, int b) {
    return a>b;
    }
};


int medianSum(vector<int>& v) {
    priority_queue<int> maxQ;
    priority_queue<int,vector<int>,cmp> minQ;
    int sum = 0;
    int tmp;

    for(int i = 0; i < v.size(); i++) {
        maxQ.push(v[i]);
        if(maxQ.size()-minQ.size() >= 2) {
            tmp = maxQ.top();
            maxQ.pop();
            minQ.push(tmp);
        }
        while(!minQ.empty() && maxQ.top() > minQ.top()) {
            minQ.push(maxQ.top());
            maxQ.push(minQ.top());
            maxQ.pop();
            minQ.pop();
        }
        sum += maxQ.top();
        sum %= 10000;
    }
    return sum;
}

int main() {
    vector<int> v;
    string file = "Median.txt";
    readData(file,v);
    int res = medianSum(v);
    cout << "the result is: "<< res << endl;
    return 0;
}

相关文章: