从一个全组合算法想到的……

jackylingzeng 2009-03-14 12:20:08
我刚学算法,这两天都在写全排列全组合,都是用字典序法,今天有幸看到了 http://topic.csdn.net/u/20090217/21/f41ed9f6-f929-451c-a5c9-80d2e408422a.html?seed=2130980366 这张帖子,其中大牛们的算法很精妙让我耳目一新,但我现在有些疑惑,我按组合数学书上的字典序算法实现的全组合 n = 11(ABCDEFGHIJk)时 平均时间在0.3秒带屏幕显示排列结果(我的配置是迅驰I 1.4G 1G内存),和帖子里 127楼 min_jie 用C#实现的时间差不多。我不是认为我比帖子里的大牛们强,因为他们的方法很精妙,我一点都没想到过,而且要慢慢看才能理解他们的算法,也不认为他们钻研算法达到最好是徒劳的,因为当n很大时,只有最优秀的算法才能体现效率,但我的疑惑是最普遍的字典序算法比这些精妙的算法其实相差多少呢?而且当N很大时,真的就相差很大吗?希望大家多谈谈意见。

这是我实现的字典序全组合 n = 11 完全按照组合数学书上算法写的。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 元素数量
#define ELEM_SIZE 11
// 打印元素排列
void printString(char s[], int list[], int size);
// 初始化数组
void initList(int list[], int size);
// 字典序生成组合
void combinDict(char s[], int n, int k);

int main(void)
{
clock_t ct;
// 定义 ELEM_SIZE + 1个元素数组,使下标与值相对应
int k;
char s[ELEM_SIZE + 2] = "0ABCDEFGHIJk";

ct = clock();
// 字典序生成组合
for (k = 1; k <= ELEM_SIZE; k++)
{
combinDict(s, ELEM_SIZE, k);
}

ct = clock() - ct;

printf("time : %f\n", (double)ct / CLK_TCK);

return 0;
}

void initList(int list[], int size)
{
int i;

// 使 list[0] 为有符号最大值
list[0] = ~0U >> 1;

// 生成数组
for (i = 1; i <= size; i++)
{
list[i] = i;
}
}

void combinDict(char s[], int n, int k)
{
int i, j, *list, *blist;

i = k;
list = calloc(sizeof(int), n + 1);
blist = calloc(sizeof(int), k + 1);

// 初始化数组
initList(list, n + 1);
// 打印第一个元素组合
printString(s, list, k + 1);


// 字典序算法
while (i > 0)
{
if (list[i] < n - k + i)
{
// 生成 blist[i]
blist[i] = list[i] + 1;

// 若 i 不是最后一个元素k
if (i < k)
{
j = i + 1;

// 生成 blist[i + 1]...[k]
while (j <= k)
{
blist[j] = blist[j - 1] + 1;
j++;
}
}

// 使list[i]...[k] = blist[i]...[k]
while (i <= k)
{
list[i] = blist[i];
i++;
}

// 打印元素组合
printString(s, list, k + 1);

i = k;
}
else
{
i--;
}
}
}

void printString(char s[], int list[], int size)
{
int i;
for (i = 1; i < size; i++)
{
printf("%c", s[list[i]]);
}

printf("\n");
}



...全文
247 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
spirit_sheng 2009-03-14
  • 打赏
  • 举报
回复
绿色夹克衫 2009-03-14
  • 打赏
  • 举报
回复
字典序本身就是个不错的算法,不过效率很难达到最高,因为存在一些插入运算,当然依照实现方式的不同,效率上会有差别.

另外如果考虑到输出,那么这些算法的效率就全都回到同一个等级上了,因为输出本身是很慢的,
在比较效率和速度的时候,往往先不考虑输出.经常是生成需要1秒,效率高的可能只需要0.1秒,但是输出可能要上百秒
这样的话101同100.1比就没什么差别了!

所以LZ在比较效率的时候,最好先不输出,或者输出到字符串......这样才能看出纯粹算法以及实现本身的效率。

另外这类问题的算法效率其实都差不了多少,主要还是看如何编程实现!
lukios 2009-03-14
  • 打赏
  • 举报
回复
来顶一下啊,学习学习
源码下载地址: https://pan.quark.cn/s/572a538835a2 ### 关于VOC2012训练数据集的说明 #### 1. 数据集的基本介绍 VOC2012(Visual Object Classes 2012)是Pascal VOC挑战赛中的一个重要组成部分,该挑战赛被视为一种广泛应用的图像识别和物体检测基准数据集。VOC2012主要应用于衡量计算机视觉算法在对象分类、定位以及检测任务上的表现水平。它包含了大量经过标注的图像,这些图像涉及多个不同的类别,并且图像中的每一个对象都经过了细致的标记处理。 #### 2. 数据集的主要特性 - **丰富性**:VOC2012数据集收集了20个不同的类别,涵盖了诸如汽车、自行车、鸟类、猫科动物、椅子等常见的物体。 - **容量**:该数据集总共包含了约5000张用于训练的图像和约5000张用于验证的图像。 - **详细标注**:每张图像中的对象都经过了详尽的标注,包括对象的边界框和类别标识。 - **普遍适用性**:VOC2012被普遍应用于学术研究和工业应用中,作为衡量各种计算机视觉技术的标准参照之一。 #### 3. 数据集的组成成分 VOC2012数据集主要可以划分为以下几个部分: - **训练部分**:包括约2500张用于模型训练的图像。 - **验证部分**:包括约2500张用于调整模型参数的图像。 - **测试部分**:包括约4952张用于最终评估模型性能的图像。 - **标注文件**:每个图像都配备有一个XML文件,其中记录了图像中对象的位置信息和类别标签。 #### 4. 数据集的获取途径及使用方法 根据提供的信息,VOC2012训练数据集可以通过以下链接进行获取: - **获取...
已经博主授权,源码转载自 https://pan.quark.cn/s/0b6e0560b339 在信息技术领域中,网络设备的配置与管理构成了核心环节,特别是对于企业级网络架构而言。华为作为球领先的网络设备生产商,其产品被广泛部署于不同规模的网络系统中。本篇将重点阐述如何借助ENSPLite(简称ENSP)对华为交换机实施配置与维护,以及设备包数据导入的操作方法。 ENSP的完整名称为Enterprise Network Simulation Platform Lite,这是一款由华为研发的网络仿真工具,它支持用户在虚拟场景下对网络设备,如路由器、交换机等进行模拟与测试。这种功能为学习华为网络技术、执行设备配置以及诊断故障提供了极大的支持。 我们接下来分析“导入设备包”的含义。在ENSP平台上,设备包是指包含特定华为设备型号及软件版本的资料文件,通过导入这些资料文件,用户能够在虚拟环境中构建出与真实设备高度相似的仿真模型,从而进行配置操作和实验验证。举例来说,“CE.rar”极有可能是一款华为CE系列交换机的设备包,CE系列是华为推出的面向企业应用的核心交换机,具备优异的性能表现和极高的可靠性,常被应用于数据中心及大型企业网络环境中。 设备包导入的操作流程如下: 1. **获取设备包**:用户需要从华为的官方网站或相关的技术支持社区获取对应型号的设备包,例如“CE.rar”。 2. **部署ENSP**:保证已安装最新版本的ENSP软件,并启动该程序。初次使用时,可能需要完成一些基础设定,比如设定工作路径等。 3. **执行设备包导入**:在ENSP的操作界面中,选择“文件”选项卡,随后点击“导入”功能,定位到已下载的“CE.rar”文件,并依照指引完成导入动作。此步骤...

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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