加为好友
发送私信
在线聊天
hxxwcc
等级:
可用分等级:中农
总技术分:112
总技术分排名:89076
发表于:2008-02-29 15:25:15 54 楼 得分:0
我把我改过后的那个算法贴一下,并说明一下效率.参照我在9和10楼,以及16楼的发言 1.一个数组,用于读取文件,每次读进去10000个数字 1.一个链表,大小10000,指针指向头尾部,称min和max(事实是指向尾部前一个位置) 2.数组的数字读进链表,并且排序一下 3.数组读文件,10000个 4.10000个数字插入到list中.其中,1)比min指针小的数字,忽略;2)大于max的,max指针移到min指针位置,min右移一步.3)介于两者之间的,max指针不动,从min指针出发,寻找此数字应该插入的位置,插入.然后min指针右移,原来指的位置失效.4)当min指针到达链表尾部(max指针不可能在这里如果min能够到达),min回到初始位置 5.重复3-4直至完成i 分析效率: 明显算法的效率是在第4步上来决定. (1).4中,(不管4)步) 1),2)步是O(1),3)ASL=5000 (2).3)出现的多少影响了算法的整体效率.事实上,当赛选进行到一定时间后,绝大部分的数字应该是走的1)情况,所以规模越大,算法应该越快 (3)此算法和KMP一样是"不回头的"算法 (4)与3楼的算法进行比较.我这里有优势的是4中的2)情况,此点比他的算法优秀;但是3)情况效率不如他 (5)3)应该可以改进 实际结果: 规模 创建文件 空跑文件 所用时间 实际时间(单位均为秒) 1e7 30(大概) 10 20 10 5e7 118 54 62 8 也就是说,5千万的规模甚至比1千万用时间小... 和前面分析吻合(不是必然) 我是通过 <ctime>里面的函数来计算时间的,秒级别 下面贴的代码不能直接运行,因为用到了一些未贴出来的东东 大家看一下就算了哈^.^ C/C++ code
void top10000( void )
{
FileRelated f;
Counter < int > lengthForReadFile;
vector < double > vectorForRead(VECTOR_SIZE);
list < double > listForInsert(VECTOR_SIZE);
/* used for create-file mode
f.CreateFile();
*/
/* used for only-read-file mode
for(Counter<int> read;read.NotArrived(f.LENGTH);read.Count(VECTOR_SIZE))
f.ReadFile(vectorForRead.begin(),VECTOR_SIZE);
return;
*/
f.ReadFile(vectorForRead.begin(),VECTOR_SIZE);
lengthForReadFile.Count(VECTOR_SIZE);
// 1stStep:
copy(vectorForRead.begin(),vectorForRead.end(),listForInsert.begin());
// 2ndStep:
sort(vectorForRead.begin(),vectorForRead.end());
list < double > ::iterator minPtr = listForInsert.begin();
list < double > ::iterator maxPtr = listForInsert.end();
-- maxPtr;
while (lengthForReadFile.NotArrived(f.LENGTH))
{
// 3rdStep:
f.ReadFile(vectorForRead.begin(),VECTOR_SIZE);
lengthForReadFile.Count(VECTOR_SIZE);
// 4thStep:
for (vector < double > ::iterator iter = vectorForRead.begin();
iter != vectorForRead.end();
++ iter)
{
if (minPtr == listForInsert.end())
minPtr = listForInsert.begin();
else if ( * iter >=* maxPtr)
{
maxPtr = minPtr ++ ;
* maxPtr =* iter;
}
else if ( * iter >* minPtr)
{
list < double > ::iterator replacePtr =
find_if(listForInsert.begin(),listForInsert.end(),
bind2nd(greater < double > (), * iter));
listForInsert.insert(replacePtr, * iter); // before replacePtr
listForInsert.erase(minPtr ++ );
}
}
}
// nthStep:
copy(listForInsert.begin(),listForInsert.end(),ostream_iterator < double > (cout, " " ));
}
修改
删除
举报
引用
回复