阿里巴巴笔试题,求例子学习一下,希望大牛能给个例子学习一下3

shiter
人工智能领域优质创作者
博客专家认证
2015-04-02 10:44:43
...全文
1010 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_21387989 2015-04-30
  • 打赏
  • 举报
回复
引用 23 楼 iyomumx 的回复:
#include <algorithm>
#include <forward_list>
#include <functional>
#include <iostream>
#include <iterator>
#include <memory>
#include <queue>
#include <random>
#include <string>
#include <unordered_map>
#include <utility>

using namespace std;

template < typename TTask >
class ManagedQueue
{
//typedefs
public:
    typedef typename queue< TTask > TaskQueue;
    typedef unordered_map< int, int > UserMap;
    typedef forward_list< int > TaskSelections;
    typedef unordered_map< int, TaskQueue > TaskQueues;
//Fields
public:
    UserMap Users;
private:
    TaskQueues tasks;   //每个用户拥有一个TaskQueue
    TaskSelections task_queues; //内含大量UID,其数量和用户配额相同
    mt19937 rng;    //随机数发生器
//Methods
private:
    //向备选队列集合中随机插入用户ID,以便Dequeue时能按配额均匀取出任务
    void RandomInsert(int user_id, int count)
    {
        uniform_int_distribution<int> dist(0, 2);
        if (task_queues.empty())
        {
            for (int i = 0; i < count; i++)
            {
                task_queues.push_front(user_id);
            }
        }
        else
        {
            while (count > 0)
            {
                for (auto i = task_queues.begin(); i != task_queues.end(); i++)
                {
                    if (dist(rng) == 1)
                    {
                        task_queues.insert_after(i, user_id);
                        count--;
                    }
                }
            }
        }
    }
public:
    //UserMap: UID -> 配额
    ManagedQueue(const UserMap& user_table)
        : Users(user_table), rng(random_device()())
    {
        //为每一个用户分配一个任务队列
        for (auto& p : user_table)
        {
            tasks.emplace(p.first, queue< TTask >());
        }
    }
    //如果添加任务前用户任务队列为空,就向备选队列集合中添加与配额相当数量的UID
    void Enqueue(int user_id, const TTask& task)
    {
        auto& q = tasks[user_id];
        bool insert_new = q.empty();
        q.push(task);
        if (insert_new)
        {
            RandomInsert(user_id, Users[user_id]);
        }
    }
    //在备选队列中随机抽一个UID,并根据UID找到对应的任务队列,从任务队列中取出任务
    //如果任务队列中没有任务,那么从备选队列集合中删除对应的UID
    TTask Dequeue()
    {
        uniform_int_distribution<int> dist(0, distance(task_queues.begin(), task_queues.end()) - 1);
        auto it = task_queues.begin();
        advance(it, dist(rng));
        auto& q = tasks[*it];
        auto ret = q.front();
        q.pop();
        if (q.empty())
        {
            task_queues.remove_if([&](int user_id) { return tasks[user_id].empty(); });
        }
        return ret;
    }
};

int main()
{
    unordered_map<int, int> user = { {1001, 10}, {1002, 20}, {1003, 40}, {1004, 30} };
    ManagedQueue<string> q(user);
    for (int i = 0; i < 1000; i++)
    {
        q.Enqueue(1001 + i % 4, string("Task ") + to_string(i % 4 + 1));
    }
    
    for (int i = 0; i < 400; i++)
    {
        cout << q.Dequeue() << "\t";
    }
    return 0;
}
试做了一下,应该还有很多地方可以优化,或者有更好的算法?
水平不够看不懂
shiter 2015-04-30
  • 打赏
  • 举报
回复
引用 23 楼 iyomumx 的回复:
#include <algorithm>
#include <forward_list>
#include <functional>
#include <iostream>
#include <iterator>
#include <memory>
#include <queue>
#include <random>
#include <string>
#include <unordered_map>
#include <utility>

using namespace std;

template < typename TTask >
class ManagedQueue
{
//typedefs
public:
    typedef typename queue< TTask > TaskQueue;
    typedef unordered_map< int, int > UserMap;
    typedef forward_list< int > TaskSelections;
    typedef unordered_map< int, TaskQueue > TaskQueues;
//Fields
public:
    UserMap Users;
private:
    TaskQueues tasks;   //每个用户拥有一个TaskQueue
    TaskSelections task_queues; //内含大量UID,其数量和用户配额相同
    mt19937 rng;    //随机数发生器
//Methods
private:
    //向备选队列集合中随机插入用户ID,以便Dequeue时能按配额均匀取出任务
    void RandomInsert(int user_id, int count)
    {
        uniform_int_distribution<int> dist(0, 2);
        if (task_queues.empty())
        {
            for (int i = 0; i < count; i++)
            {
                task_queues.push_front(user_id);
            }
        }
        else
        {
            while (count > 0)
            {
                for (auto i = task_queues.begin(); i != task_queues.end(); i++)
                {
                    if (dist(rng) == 1)
                    {
                        task_queues.insert_after(i, user_id);
                        count--;
                    }
                }
            }
        }
    }
public:
    //UserMap: UID -> 配额
    ManagedQueue(const UserMap& user_table)
        : Users(user_table), rng(random_device()())
    {
        //为每一个用户分配一个任务队列
        for (auto& p : user_table)
        {
            tasks.emplace(p.first, queue< TTask >());
        }
    }
    //如果添加任务前用户任务队列为空,就向备选队列集合中添加与配额相当数量的UID
    void Enqueue(int user_id, const TTask& task)
    {
        auto& q = tasks[user_id];
        bool insert_new = q.empty();
        q.push(task);
        if (insert_new)
        {
            RandomInsert(user_id, Users[user_id]);
        }
    }
    //在备选队列中随机抽一个UID,并根据UID找到对应的任务队列,从任务队列中取出任务
    //如果任务队列中没有任务,那么从备选队列集合中删除对应的UID
    TTask Dequeue()
    {
        uniform_int_distribution<int> dist(0, distance(task_queues.begin(), task_queues.end()) - 1);
        auto it = task_queues.begin();
        advance(it, dist(rng));
        auto& q = tasks[*it];
        auto ret = q.front();
        q.pop();
        if (q.empty())
        {
            task_queues.remove_if([&](int user_id) { return tasks[user_id].empty(); });
        }
        return ret;
    }
};

int main()
{
    unordered_map<int, int> user = { {1001, 10}, {1002, 20}, {1003, 40}, {1004, 30} };
    ManagedQueue<string> q(user);
    for (int i = 0; i < 1000; i++)
    {
        q.Enqueue(1001 + i % 4, string("Task ") + to_string(i % 4 + 1));
    }
    
    for (int i = 0; i < 400; i++)
    {
        cout << q.Dequeue() << "\t";
    }
    return 0;
}
试做了一下,应该还有很多地方可以优化,或者有更好的算法?
非常感谢您的代码
iyomumx 2015-04-30
  • 打赏
  • 举报
回复
#include <algorithm>
#include <forward_list>
#include <functional>
#include <iostream>
#include <iterator>
#include <memory>
#include <queue>
#include <random>
#include <string>
#include <unordered_map>
#include <utility>

using namespace std;

template < typename TTask >
class ManagedQueue
{
//typedefs
public:
    typedef typename queue< TTask > TaskQueue;
    typedef unordered_map< int, int > UserMap;
    typedef forward_list< int > TaskSelections;
    typedef unordered_map< int, TaskQueue > TaskQueues;
//Fields
public:
    UserMap Users;
private:
    TaskQueues tasks;   //每个用户拥有一个TaskQueue
    TaskSelections task_queues; //内含大量UID,其数量和用户配额相同
    mt19937 rng;    //随机数发生器
//Methods
private:
    //向备选队列集合中随机插入用户ID,以便Dequeue时能按配额均匀取出任务
    void RandomInsert(int user_id, int count)
    {
        uniform_int_distribution<int> dist(0, 2);
        if (task_queues.empty())
        {
            for (int i = 0; i < count; i++)
            {
                task_queues.push_front(user_id);
            }
        }
        else
        {
            while (count > 0)
            {
                for (auto i = task_queues.begin(); i != task_queues.end(); i++)
                {
                    if (dist(rng) == 1)
                    {
                        task_queues.insert_after(i, user_id);
                        count--;
                    }
                }
            }
        }
    }
public:
    //UserMap: UID -> 配额
    ManagedQueue(const UserMap& user_table)
        : Users(user_table), rng(random_device()())
    {
        //为每一个用户分配一个任务队列
        for (auto& p : user_table)
        {
            tasks.emplace(p.first, queue< TTask >());
        }
    }
    //如果添加任务前用户任务队列为空,就向备选队列集合中添加与配额相当数量的UID
    void Enqueue(int user_id, const TTask& task)
    {
        auto& q = tasks[user_id];
        bool insert_new = q.empty();
        q.push(task);
        if (insert_new)
        {
            RandomInsert(user_id, Users[user_id]);
        }
    }
    //在备选队列中随机抽一个UID,并根据UID找到对应的任务队列,从任务队列中取出任务
    //如果任务队列中没有任务,那么从备选队列集合中删除对应的UID
    TTask Dequeue()
    {
        uniform_int_distribution<int> dist(0, distance(task_queues.begin(), task_queues.end()) - 1);
        auto it = task_queues.begin();
        advance(it, dist(rng));
        auto& q = tasks[*it];
        auto ret = q.front();
        q.pop();
        if (q.empty())
        {
            task_queues.remove_if([&](int user_id) { return tasks[user_id].empty(); });
        }
        return ret;
    }
};

int main()
{
    unordered_map<int, int> user = { {1001, 10}, {1002, 20}, {1003, 40}, {1004, 30} };
    ManagedQueue<string> q(user);
    for (int i = 0; i < 1000; i++)
    {
        q.Enqueue(1001 + i % 4, string("Task ") + to_string(i % 4 + 1));
    }
    
    for (int i = 0; i < 400; i++)
    {
        cout << q.Dequeue() << "\t";
    }
    return 0;
}
试做了一下,应该还有很多地方可以优化,或者有更好的算法?
阿良良木月火 2015-04-30
  • 打赏
  • 举报
回复
引用 20 楼 wangyaninglm 的回复:
[quote=引用 19 楼 my_live_123 的回复:] [quote=引用 15 楼 wangyaninglm 的回复:] [quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 你的头像迷倒了多少程序猿?虽然你是汉纸[/quote] 我以前一直用冲田杏梨,知道被csdn客服把我号给封了。。。[/quote]
一根烂笔头 2015-04-30
  • 打赏
  • 举报
回复
引用 20 楼 wangyaninglm 的回复:
[quote=引用 19 楼 my_live_123 的回复:] [quote=引用 15 楼 wangyaninglm 的回复:] [quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 你的头像迷倒了多少程序猿?虽然你是汉纸[/quote] 我以前一直用冲田杏梨,知道被csdn客服把我号给封了。。。[/quote]
蚂蚁上树 2015-04-29
  • 打赏
  • 举报
回复
不懂 。 帮顶。
Hare_ 2015-04-29
  • 打赏
  • 举报
回复
shiter 2015-04-29
  • 打赏
  • 举报
回复
引用 19 楼 my_live_123 的回复:
[quote=引用 15 楼 wangyaninglm 的回复:] [quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 你的头像迷倒了多少程序猿?虽然你是汉纸[/quote] 我以前一直用冲田杏梨,知道被csdn客服把我号给封了。。。
一根烂笔头 2015-04-29
  • 打赏
  • 举报
回复
引用 15 楼 wangyaninglm 的回复:
[quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 你的头像迷倒了多少程序猿?虽然你是汉纸
苏叔叔 2015-04-29
  • 打赏
  • 举报
回复
引用 17 楼 wangyaninglm 的回复:
[quote=引用 16 楼 zhangxiangDavaid 的回复:] [quote=引用 15 楼 wangyaninglm 的回复:] [quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 真人是否像图片一样漂亮 [/quote] 看来你是csdn的新手。。。抠脚大汉采用美女头像。。。[/quote] 我对美有一种执着的追求……
shiter 2015-04-29
  • 打赏
  • 举报
回复
引用 16 楼 zhangxiangDavaid 的回复:
[quote=引用 15 楼 wangyaninglm 的回复:] [quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 真人是否像图片一样漂亮 [/quote] 看来你是csdn的新手。。。抠脚大汉采用美女头像。。。
苏叔叔 2015-04-29
  • 打赏
  • 举报
回复
引用 15 楼 wangyaninglm 的回复:
[quote=引用 13 楼 my_live_123 的回复:] 发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。[/quote] 真人是否像图片一样漂亮
shiter 2015-04-29
  • 打赏
  • 举报
回复
引用 13 楼 my_live_123 的回复:
发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
小的不才,研二,以后多向大牛讨教。。。
一根烂笔头 2015-04-29
  • 打赏
  • 举报
回复
发现你是爆刷ACM,笔试题,看来是找工作的节奏啊,大三,研二?
赵4老师 2015-04-29
  • 打赏
  • 举报
回复
不一定对,仅供参考:
//u1 20 u2 30 u3 50
if (one(u1) or one(u2) or one(u3)) {pass(cu); return;}
if (two(u1,u2)) {if (rand()%5<2) pass(u1) else pass(u2);return;}
if (two(u2,u3)) {if (rand()%8<3) pass(u2) else pass(u3);return;}
if (two(u3,u1)) {if (rand()%7<5) pass(u3) else pass(u1);return;}
if (three(u1,u2,u3)) {
    int tmp=rand()%10;
    if (tmp<2) {pass(u1);return;}
    if (tmp<5) {pass(u2);return;}
                pass(u3);return;
}
shiter 2015-04-29
  • 打赏
  • 举报
回复
引用 10 楼 u010027950 的回复:
我咋觉得像线程同步的问题?涉及到信号量方面的
觉的应该不对。。。
  • 打赏
  • 举报
回复
我咋觉得像线程同步的问题?涉及到信号量方面的
老李家的小二 2015-04-29
  • 打赏
  • 举报
回复
这个看来很高大上,我只能说”赖蛤蟆跳井,不懂“
shiter 2015-04-29
  • 打赏
  • 举报
回复
引用 6 楼 hbu_pig 的回复:
引用 5 楼 qq359593234 的回复:
操作系统的知识,记得叫“银行家算法”。
好扯淡。银行家算法是避免死锁的吧
是啊,他忽悠人。。。
猴头 2015-04-29
  • 打赏
  • 举报
回复
好多年过去了,我都忘记了
加载更多回复(3)

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧