【醒目】我的房间分配问题源码

clasj 2007-12-16 04:22:14


#include <ctime>
#include <vector>
#include <fstream>

using namespace std;

#define MAX_NAME_LENGTH 10
#define MAX_FLAG_LENGTH 50

struct TStudent {
char Name[MAX_NAME_LENGTH+1];
char Flag[MAX_FLAG_LENGTH+1];
};

typedef vector<TStudent> TStudents;

void InputDataFromFile(TStudents& Students, int& StudentNumber)
{
char s[MAX_NAME_LENGTH+1+MAX_FLAG_LENGTH+1];
fstream fin;
fin.open("Students.in", ios_base::in);
fin.getline(s, sizeof(s));
StudentNumber = atoi(s);
for (int i=0; i<StudentNumber; ++i) {
fin.getline(s, sizeof(s));
s[MAX_NAME_LENGTH] = 0;
TStudent Student;
strcpy(Student.Name, s);
strcpy(Student.Flag, &s[MAX_NAME_LENGTH+1]);
Students.push_back(Student);
}
}

int Evaluate2Student(const TStudent& Student1, const TStudent& Student2)
{
int Result = 0;
for (int i=0; i<MAX_FLAG_LENGTH; ++i) {
Result += abs(Student1.Flag[i]-Student2.Flag[i]);
}
return Result;
}

double EvaluateStudents(const TStudents& Students, int StudentNumber)
{
double Result = 0;
for (int i=0; i<StudentNumber/2; ++i) {
Result += Evaluate2Student(Students[i*2], Students[i*2+1])/200.0;
}
return Result;
}

int Find(const TStudents& TempStudents, int Index, int& MinTD)
{
int Result;
MinTD = 200;
for (int i=0; i<(int)TempStudents.size(); ++i) {
if (i==Index) {
continue;
}
int TD = Evaluate2Student(TempStudents[i], TempStudents[Index]);
if (TD<MinTD || (TD==MinTD && rand()%2==0)) {
MinTD = TD;
Result = i;
}
}
return Result;
}

void Foo(TStudents& Students, TStudents& TempStudents, int Index)
{
int TD1, TD2;
int n = Find(TempStudents, Index, TD1);
if (TD1==0 || Index==Find(TempStudents, n, TD2) || (TD1==TD2 && rand()%2==0)) {
Students.push_back(TempStudents[Index]);
Students.push_back(TempStudents[n]);
if (Index>n) {
TempStudents.erase(TempStudents.begin()+Index);
TempStudents.erase(TempStudents.begin()+n);
}
else {
TempStudents.erase(TempStudents.begin()+n);
TempStudents.erase(TempStudents.begin()+Index);
}
}
else {
Foo(Students, TempStudents, n);
}
}

void ComputeStudentAssignments(TStudents& Students, int /*StudentNumber*/)
{
TStudents TempStudents = Students;
Students.clear();
srand((unsigned)time(NULL));
while (TempStudents.size()>0) {
Foo(Students, TempStudents, rand()%(int)TempStudents.size());
}
}

void PrintStudentAssignmentToFile(const TStudents& Students, int StudentNumber)
{
fstream fout;
fout.open("Assignments.out", ios_base::out);
fout << StudentNumber << endl;
for (int i=0; i<StudentNumber; ++i) {
fout << Students[i].Name << ends << Students[i].Flag << endl;
}
}

int main(int argc, char* argv[])
{
TStudents Students;
int StudentNumber;

InputDataFromFile(Students, StudentNumber);
double first = EvaluateStudents(Students, StudentNumber);
printf("The initial Disharmony is %.3f\n", first);
time_t start = time(NULL);
ComputeStudentAssignments(Students, StudentNumber);
time_t end = time(NULL);
printf("Time to compute room assignments is %d seconds\n", end-start);
double final = EvaluateStudents(Students, StudentNumber);
printf("Final Disharmony is %.3f\n", final);
PrintStudentAssignmentToFile(Students, StudentNumber);

system("pause");
return 0;
}



声明:
1.这是我看完题目后最先想到的解决方案,但是后来我发现这样解决是有问题的(思路上的),我想问一下大家你们看出问题在哪里了没有?
2.有没有哪位大虾能够以此程序为范本,讲解一下如何将TBB用进来啊?
...全文
660 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
灰色_H 2007-12-22
  • 打赏
  • 举报
回复
你们说先排序一下那么TD值不就可以降低了,但是不知道排序要花多少时间,还是没办法排的
LeopoldChen 2007-12-21
  • 打赏
  • 举报
回复
学习中......
OpenHero 2007-12-20
  • 打赏
  • 举报
回复
to clasj:
1.第一个问题,在执行优化的时候,cpu会自行对齐你的内存,因为cpu的执行方式你就可以看到,intel的几本书和《windows游戏编程大师》里面都有讲到优化的部分,都有内存对齐的部分,更实际的是,你可以自己测试一下:)
2.TBB的手册上有说明,可能你在看手册的时候忽略某些部分了,呵呵,你可以仔细看看intel的TBB的文章"301132_301132.pdf"第5章“Containers”里面的注意事项,哪里有详细的说明,TBB在有些地方是不安全和在那些地方可以用STL来替换TBB,呵呵
clasj 2007-12-19
  • 打赏
  • 举报
回复
1.OpenHero,我非常认同你第3个观点(并不表示不认同1、2,呵呵),看来我对于并行化思想还是不得要领,在我看来我的这段代码好像并不能够并行化,虽然有用到循环,但是每次循环并不独立。
2.楼上的,地址是:http://softwarecontests-zho.intel.com/threadingchallenge
3.刚才我发现现在得分最高的人有300分,怎么回事啊,进入评分阶段了么?
cwbcwb505 2007-12-19
  • 打赏
  • 举报
回复
请问,房间分配问题的题目是什么?想和你讨论讨论。
OpenHero 2007-12-18
  • 打赏
  • 举报
回复
to lz,
1.可以看看内存对齐和内存优化的相关问题,就可以解决struct的内存分配的时候对齐和在处理cpu处理的时候,可以加快速度
2.TBB的example里面有几个demo,都是很好的参考资料,里面有很详细的应用,其实不是为了用TBB而用TBB,只是你的算法如果适合用TBB就用它,在TBB中有一些是为了多线程的时候不发生冲突,加进去一些锁,虽然很高效,但是在有的应用的时候,不一定有STL的效率高,那就得看你的应用环境是什么。
3.更主要的是要用并行的思想来解决串行问题,这个才是解决问题的关键,也是用多核来处理问题的关键:)

欢迎lz继续讨论,呵呵:)
langya54 2007-12-17
  • 打赏
  • 举报
回复
mark
drc606 2007-12-17
  • 打赏
  • 举报
回复
先Mark下
clasj 2007-12-17
  • 打赏
  • 举报
回复
1.多谢大家关注
2.OpenHero你不妨说说如何优化呀
3.真的希望熟悉TBB的朋友能够讲解一下如何将TBB应用到这个案例
4.鄙视楼上的,呵呵
neituib 2007-12-17
  • 打赏
  • 举报
回复
内部推荐助你成功找到更合适的工作

内推网 内部推荐,求职快线
OpenHero 2007-12-17
  • 打赏
  • 举报
回复
struct TStudent {
char Name[MAX_NAME_LENGTH+1];
char Flag[MAX_FLAG_LENGTH+1];
};

typedef vector <TStudent> TStudents;
从内存布局来说,这里可以优化的
:)
kelkch 2007-12-17
  • 打赏
  • 举报
回复
还用上了vector, 太厉害了.
kelkch 2007-12-17
  • 打赏
  • 举报
回复
struct TStudent {
char Name[MAX_NAME_LENGTH+1];
char Flag[MAX_FLAG_LENGTH+1];
};

typedef vector<TStudent> TStudents;



学到不少.
OpenHero 2007-12-17
  • 打赏
  • 举报
回复
先不说算法,但从编程的角度来说,就可以有很多优化的地方
真的很感谢lz贴出来这样的代码,让大家互相学习:)

mark一下
mikster 2007-12-17
  • 打赏
  • 举报
回复
慢死了....数组王道。
zhangyixian525 2007-12-16
  • 打赏
  • 举报
回复
关注一下,这些代码貌似相识.结合到一起就看不太明白了.哈哈,期待更完美的解决方案.

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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