A,B序列调换问题

nandizhu 2009-08-11 04:57:49
有两段整数序列A,B

能做的操作只有change(i,j)意思是对换i,j位置上的整数,
现在问B序列需要最少好多次change操作才能变成A序列

如果不能变成A序列则输出-1
...全文
480 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbug9002 2009-08-14
  • 打赏
  • 举报
回复
前几天还做一个类似的题:
public class Sorter{
private HashMap<Item,Integer> originalList=new HashMap<Item,Integer>();
//在构造方法中把myList中的数据的序号用HashMap记录下来.
//
Sorter(List<Item> myList){
for(int i=0;i<myList.size();i++){
originalList.put(myList.get(i),i);
}
}
//用自己定义的comparator对另一个myList排序,java自己做好sort方法应该采用的是归并排序。
//交换元素最少的应该是快排吧。
//
public void sort(List<Item> myList){
Collections.sort(myList,new comparator());
}

//自己定义的比较器,用两个数据的序号来决定他们的次序。,
//
public class comparator implements Comparator<Item>{
public int compare(Item i1,Item i2){
return originalList.get(i1)-originalList.get(i2);
}
public boolean equals(Object o){
return false;
}
}
}
gumbour 2009-08-14
  • 打赏
  • 举报
回复
交换次数最多为 n,
for (i=0;i<n;i++)
{
找到j使,a[i]=b[j];
交换b[i],b[j];

如果某个I找不到对应的J,则 return -1;
}



楼主只说了要最少交换次数,不要求最少比较次数,所以 O(nlogn)可能是算法复杂度,但肯定不是交换的复杂度。

tanwan 2009-08-13
  • 打赏
  • 举报
回复
先找出序列,然后在不对称的放进一个队列里然后每次找的时候有不对称的都与队列里去判断,对称上的就++然后在判断2个是否全部对称,全部对称就过,如果有不对称的就继续往里面添加
linren 2009-08-12
  • 打赏
  • 举报
回复
(上接7楼)

【说明】
因为数组下标从0位开始
所以“change 1,8”表示的实际上是把B中的第2个数(1位)和第9个数(8位)进行交换……

6楼的算法得到的或许一定是最优解
但是目前还不知道怎样来证明这点……
同时也找不到一个反例来证明这样得到的不是最优解……
showjim 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 paradin 的回复:]
mark
找圈圈。
[/Quote]
找尽可能多的环
AppZ 2009-08-12
  • 打赏
  • 举报
回复
m
fire_woods 2009-08-12
  • 打赏
  • 举报
回复
先排序.
fxg0110 2009-08-12
  • 打赏
  • 举报
回复
想来想去还是只有找圈圈能效率高点
找环的条件:
1.串环时A中元素连对应位置B中元素,B中元素连A中对应数值A中元素
2.每个元素仅可被串一次
3.若A、B元素个数不一样,或有元素没有被串(即有元素不能构成环)

if(A.size!=B.size||有元素不能构成环) return -1;
return A.size-总环数


本来想写写代码的,但有事就只好先谢谢思路了,哈哈
fxg0110 2009-08-12
  • 打赏
  • 举报
回复
好像只是要返回次数而已吧
linren 2009-08-11
  • 打赏
  • 举报
回复
(上接6楼)

【程序】
#include <stdio.h>
#include <stdlib.h>
/**只用修改这里*******************************/
#define ASIZE 10
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10]={1,5,10,3,4,6,8,7,2,9};
/*******************************只用修改这里**/

struct node{
int a,b;
};

int fun(int *a,int *b,int len){
int i,j,z,c=0,t=0,r=0,tmp;
char *ruler;
struct node* note;
int *chose;
int *save;

printf("A\t");
for(i=0;i<len;i++) printf("%d, ",a[i]);printf("\n");

/* 保存B的值 */
save=(int*)malloc(sizeof(int)*len);
printf("B\t");
for(i=0;i<len;i++){
printf("%d, ",b[i]);save[i]=b[i];
}printf("\n");

/* 创建标尺 */
ruler=(char*)malloc(sizeof(char)*len);
for(i=0;i<len;i++){
if(a[i]==b[i]) ruler[i]=1;
else{
ruler[i]=0;c++;
}
}

/* 创建记录本 */
note=(struct node*)malloc(sizeof(struct node)*c);
chose=(int*)malloc(sizeof(int)*c);


for(i=0;i<len;i++){
if(ruler[i]==1) continue;
r=0;
for(j=i+1;j<len;j++){
if(ruler[j]==1) continue;
if(a[i]==b[j]) chose[r++]=j;
}

/* B不能变成A */
if(r==0){
free(ruler);free(note);free(chose);free(save);return -1;
}

/* 优选 */
for(z=0;z<r;z++){
if(a[chose[z]]==b[i]){
note[t].a=i;note[t].b=chose[z];t++;
ruler[i]=1;ruler[chose[z]]=1;
tmp=b[i];b[i]=b[chose[z]];b[chose[z]]=tmp;c=c-2;
}
}
if(ruler[i]==1) continue;

/* 随选 */
note[t].a=i;note[t].b=chose[0];t++;
ruler[i]=1;
tmp=b[i];b[i]=b[chose[0]];b[chose[0]]=tmp;c=c-1;
}
for(i=0;i<t;i++){
printf("change %d,%d\n",note[i].a,note[i].b);
printf("B\t");
tmp=save[note[i].a];save[note[i].a]=save[note[i].b];save[note[i].b]=tmp;
for(j=0;j<len;j++) printf("%d, ",save[j]);printf("\n");
}

free(ruler);free(note);free(chose);free(save);return 0;
}

int main(){
if(fun(a,b,ASIZE)==-1) printf("can not change B to A!\n");
return 0;
}

【运行结果】
A 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
B 1, 5, 10, 3, 4, 6, 8, 7, 2, 9,
change 1,8
B 1, 2, 10, 3, 4, 6, 8, 7, 5, 9,
change 2,3
B 1, 2, 3, 10, 4, 6, 8, 7, 5, 9,
change 3,4
B 1, 2, 3, 4, 10, 6, 8, 7, 5, 9,
change 4,8
B 1, 2, 3, 4, 5, 6, 8, 7, 10, 9,
change 6,7
B 1, 2, 3, 4, 5, 6, 7, 8, 10, 9,
change 8,9
B 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
Press any key to continue

【说明】
以上是对6楼交换策略的实现
不过,6楼的交换策略找到的有可能只是近似解而并不是最优解……
linren 2009-08-11
  • 打赏
  • 举报
回复
1 01 0 1 :A
0 01 1 1 :B

【标尺】
0 11 0 1 首先判断A、B中哪些位不同,相同的位不用交换(可以标记为1),不同的位需要进行交换(标记为1)

0 01 1 1 B
1 01 0 1 交换1次=A

关于交换的策略
有以下的一种思路:

依次找到标尺上为0的位
在后面为0的位中寻找满足的条件进行交换……

寻找时
优先选取交换后两位都满足条件的数

置当交换后满足条件的位为1……
寻找下一个标尺为0的位

如果没有找到符合条件的数
返回-1表示不能通过交换把B变成A
nandizhu 2009-08-11
  • 打赏
  • 举报
回复
要是最少的 对换。。。比如上面两个序列只需要对换1,4位置即可
nandizhu 2009-08-11
  • 打赏
  • 举报
回复
那样会是最少的交换吗??? 因为序列里可以允许有相同的值
比如 A:10101
B:00111

怎么排序?
hyram 2009-08-11
  • 打赏
  • 举报
回复
先对B序列排序,然后每一位查找,交换,O(nlog(n))
Paradin 2009-08-11
  • 打赏
  • 举报
回复
mark
找圈圈。
fire_woods 2009-08-11
  • 打赏
  • 举报
回复
有O(nlog(n))时间复杂度的算法.
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需求侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用求解器进行高效求解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需求响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及求解器的配置方法,同时关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

33,026

社区成员

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

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