40 1234
发新话题
打印

再来一道算法题

是的直接输出就能满足要求,我两分钟写的程序没考虑优化问题,好懂就行了。

TOP

还是有点不明白,你怎么直接输出,能把程序贴出来吗?

TOP

循环中先输出,再插入啊。
你的算法最大的缺点是字母不能重

TOP

能重就脱离全排列这个概念了吧。你把程序写出来啊,我贴的程序是可以直接用VC6编译的,你改了去掉deque的发上来我看看,还没想明白怎么不用保存就能全输出。我知道的办法是利用堆栈里的局部变量i,但C/C++语言特性没有访问上层调用者局部变量的正规方法,还是没想通你怎么做的。

TOP

// aa.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <list>
#include <deque>
#include <algorithm>
#include <iostream>
using namespace std;
list<char> sc;
deque<char> dc;
char * s = "ABCD";
int t=0;
int flag=1;
void prt(char c) { cout<<c<<" "; }
void dojob(int lv) {
        if(!lv--) {
                cout<<endl;
                flag=0;
                return;
        }
        for(int i=0; i<strlen(s); ++i)
        {
                if( find(sc.begin(),sc.end(),s[i])==sc.end() )
                {
                        if (flag)
                        {
                                cout<<s[i]<<' ';
                        }else
                        {
                                for_each(sc.begin(),sc.end(),prt);
                                flag=1;
                                cout<<s[i]<<' ';
                        }
                        sc.push_back(s[i]);
                        dojob(lv);
                        sc.pop_back();
                }
        }
}
void main() {
        dojob(strlen(s));
        cout << "total: " << t << endl;
}

帮你实现的。这个算法不代表我的实现,我会用2个自己写的链表实现

TOP

你的这个实现降低了程序执行效率,因为你用的list的查找算法find是线性的。set的find方法是用的红黑树,在VC7下面的STL可以用hash_set,速度更快。
可以这么说,你的这个改进并没有减少内存占用(list的元素要分配指针,32位机上是4字节,64位上是8字字节),而且还降低了执行效率(list的链表顺序查找比set的红黑树慢,是STL里最慢的,和hash_set更不用比了)。不太成功喔。;)

我用的方法是用空间换时间,所以同时用了无序集合和队列。如果STL将来有了有序集合,就不用再分配一个线性队列了。

当然这是凭经验随手写的,要真的是程序里的关建算法,自然会完全拿C自己实现了。

TOP

大家可以把所有的程序拿出来比较一下空间和时间,实际测一下。
LibUIDK-企业级MFC界面库
从此不刷下载量了,改刷单了!

TOP

晕,用了stl还想要效率?

[ Last edited by asdfg on 2005-11-3 at 21:59 ]

TOP

stl用得好的话速度还是可以的。

TOP

引用:
Originally posted by asdfg at 2005-11-3 09:53 PM:
晕,用了stl还想要效率?

[ Last edited by asdfg on 2005-11-3 at 21:59 ]
STL效率还是不错的,除非你算法比较强,能写出更好的代码。写STL那帮人也不是吃闲饭的。
LibUIDK-企业级MFC界面库
从此不刷下载量了,改刷单了!

TOP

 40 1234
发新话题