简单谈谈设计算法题的方法

本篇文章我将分享一些算法设计的思想,仅仅是个人思考所得,欢迎各位读者与我交流!

Kingdombo

Kingdombo

这个公众号创立的初衷在于分享一些与编程或者数学相关的问题,同时致力于探讨解决这些问题的本质,以及总结归纳看待问题的视角并最终提高我们解决各种问题的能力。当然,我很渴望与朋友们一起交流!一起学习吧!

7篇原创内容

公众号

正如我即将要讲到的内容,我写这篇文章的目的不仅仅是希望大家看过后有些许的思考,或者仅仅只是对算法题更加熟练,虽然这可以依靠多刷题来获得一定的灵感和熟练度。但这些都不是我的终极目标,我的目标是希望大家各位能够深刻学习和掌握**算法的思想,**这不是仅依靠会做多少算法题来评估的,而是我们最终可以将这些思想运用到解决其他问题之中。(这些问题当然不局限于算法题)。好了,让我们正式开始吧!

01

逻辑框架

你看到的以下部分,也将是我要重点讲解的部分,在讲解完这些部分后,我会依据这些思想构设一个题目。并在文末给出问题的解决程序。

图片

02

目标

在我们设计一个算法问题的时候,首先一定要明确我们所希望达到的目标。比如,我们要求一个数组中的最大值,或者仅仅对这个数组进行求和等等。这些都是我们解决问题的目标。有同学也许会说,这不是废话吗?哈哈,这的确听上去有点是废话的意思。那么我为什么还有说一定要强调目标呢?因为只有当你真正地清楚自己要设计的问题将用来解决什么样的问题时,你才可以更好地围绕你的目标区设置若干干扰项和约束条件,并且通过这些约束条件,你可以清晰地明白自己设置的约束条件能够使你获得问题的解。

另外,如果你实在对自己目标不是很清楚,或者你认为你实在不能仅依靠目标就可以设计出相应的问题。这也没什么大碍,因为你还可以仅仅通过设置简单或复杂的约束条件从而达到某个目标,只是你可能不明确这个目标罢了。

图片

03

约束条件

在你到达你解决问题的目标之前,你会经历许多中间过程。这些中间过程在干什么?我称之为解决表达和处理题目所具有的约束条件。这句话你可以通俗地理解:比如您想去打酱油,是的,你的目标就是成功买回酱油。你将经历什么过程呢?大概可以这样说,你总得要去到有酱油的小卖铺吧,(如果你不知道哪里有卖酱油的小卖铺,那这是不是就成为你达到目标的阻碍了?或者你可能没有足够的钱来购买酱油,这也是你达成目标的阻碍。总之,在你达成一个目标,总会遇到很多很多的阻碍(约束条件),只有解决这些阻碍,才可能使你完成目标。在算法设计中,我们可以自由设置阻碍并决定障碍的难易,这也决定了我们求解目标的难易。在这之前,我们需要了解如何设置这些阻碍,这种方法不是唯一的,但是你可以通过有意识地的训练来达到你所渴望的目标。我将在之后构设题目的时候向您展示我如何设置这种约束条件。

图片

04

算法思想

这里单独说一下算法思想,它在设计算法题的时候将发挥什么作用呢?在回答这个问题之前,让我们先来看看算法设计中常见的思想有哪些:1.递归 2.动态规划  3.分治  4.贪心  5.回溯 6.搜索 等等,这些是比较常见的思想,我们的科学家已经将他们整理成了专门的概念,以帮助我们更深刻地理解计算机程序解决问题的思想和方法。整理成概念是有益的,这将帮助我们跳出某个圈子,在这个圈子里,你实在难以想到更多的东西,总之就是不成体系。这意味着你的能力很可能因为你的状态而改变。扯得有点多了。让我们回到算法思想的本身,在你知道和理解常见的算法思想后,你可以自己根据这些算法思想去设计自的全新的题目。再进阶一点,你可以考虑如何穿插这些算法思想,或者更高级的做法是,你可以自己去创造一些实用的思想,但这一步有点难了。我们还不需要那样做。最后,最重要的一点,就是这些算法思想的运用,可以使你设计及出来的题目显得比较有深度,而这些思想也是你设计更复杂、更高深的问题的基础。

图片

05

构造意识

构造意识是什么?它有什么用?我们如何培养和运用构造意识?嘿嘿,其实这个是我自己想的词儿,不过你也可以将其通俗地理解为知道某些规则后,去创造一些新东西的意识。再通俗一点儿就是,你需要不断地培养你自己创新意识和创造能力,并且你的潜意识就应该有这种觉悟。在我们明白这一点后,我们便可以根据这一意识去抽象生活中,或者是你在别的地方看到的所有可以利用的规则。然后你就可以尝试根据这些,来创造属于你的题目了。

图片

06

创建一个题目

最后,让我们来创建一个题目。

假设我的目标是在一组整数数据中寻找符合一定条件的数,我们不妨为寻找到这个数设置一些条件,比如要求这个数是偶数,但是这种条件太简单了,我们还可以要求在这堆数据中,至少有一半的数要不小于这个数。好了,让我们再加一个条件,比如要求你需要使用递归调用的方法实现。好啦,可以看到,我们在确立目标并且加了一部分约束条件后,我们最终成功构设了一个题目。在这里,我们再次看到如果你加的约束条件越多,意味着解决这个问题可能解决起来就越复杂甚至无解,所以需要我们均衡考虑再添加条件。

让我们给出这个问题的较为规范的描述:

给定一组整数数据,要求寻找一个偶数x,并且满足这组数据中至少有一半的数不小于这个数。请用递归的方式实现此题并输出所有符合条件的数。

图片

好啦!这就是本节的内容啦!附上代码如下:(仅供参考)

#include<iostream>
#include<vector>
using namespace std;
void Find(vector<int>a,int index);//寻找并且输出符合特定条件的数
int main() {
  //寻找一个一维数组中的数,这个数本身是偶数,且该数组中有至少一半的元素不小于该元素
  //请输出所有这样的元素。
  //出题的方法大概就是根据自己去设置限制约束条件,然后再进行实现即可
  //将约束条件进行限制,然后自己去想约束条件
  vector<int>a;
  int num;
  cout << "请输入你想指定的数组的大小:" << endl;
  cin >> num;
  cout << "请输入" << num << "个整数:" << endl;
  for (int i = 0; i < num; i++) {
    int temp;
    cin >> temp;
    a.push\_back(temp);
  }
  cout << "所有符合条件的数为:" << endl;
  Find(a, 0);
  return 0;
}
void Find(vector<int>a, int index) {
  if (index == a.size()) { //到达数组尾部
    return; //其中的一个终止条件
  }
  else if(a\[index\] % 2 == 1) { //不是偶数
    Find(a, index + 1); //继续搜索下一个
  }
  else {
    int count = 0;
    for (int i = 0; i < a.size(); i++) {
      if (a\[i\] >= a\[index\]) { //统计不小于该元素的所有元素的个数
        count += 1;
      }
    }
    count--;//去除自身
    if (count >= (a.size() / 2)) { //符合条件,输出该数
      cout << a\[index\] << " ";
      Find(a, index + 1); //继续寻找
    }
  }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值