如何从蛮力算法转向智能算法? [关闭]

Posted

技术标签:

【中文标题】如何从蛮力算法转向智能算法? [关闭]【英文标题】:How to move from brute force algorithm to smart algorithms? [closed] 【发布时间】:2017-08-19 00:47:23 【问题描述】:

当我解决问题时,我总是对总是给出时间限制问题的算法使用蛮力。 我真的不知道该怎么办? 如何将我的方法从蛮力算法更改为智能算法

例如我在hackerrank上解决这个问题:

“考虑一个整数数组, 。我们定义两个元素之间的绝对差,并且 (其中 ) 是 的绝对值。

给定一个整数数组,找出并打印数组中任意两个元素之间的最小绝对差。

输入格式

第一行包含一个表示(整数个数)的整数。 第二行包含用空格分隔的整数,描述 的各个值。

约束

2<n<2^5
10^-9<ai<10^9

输出格式 打印数组中任意两个元素之间的最小绝对差。

示例输入

3
3 -7 0

样本输出

3

我的方法是用每个元素减去每个元素 并打印最小差异,但它给出了时间限制问题

【问题讨论】:

当您没有正确复制问题或显示您的任何尝试时,很难提供帮助 对于瓷砖中的问题,遗憾的是没有一般收据。一个人必须“聪明”。你可以通过学习算法和数据结构获得一些经验。 @cricket_007 我复制正确 这句话不完整... "我们定义两个元素之间的绝对差,并且 (where ) 是 的绝对值。" 【参考方案1】:
    按升序对数组进行排序。

    现在检查每两个连续元素之间的差异并将差异最小化。

    Arrays.sort(arr);
    int minDiff = arr[n - 1] - arr[0];
    for (int i = 0; i < n - 1; i++) 
        int tmpDiff = arr[i + 1] - arr[i];
        if (tmpDiff < minDiff) 
            minDiff = tmpDiff;
        
    
    

简单的观察是 - 对数组进行排序时,对于任何元素 arr[i],立即较小和较大的元素将分别留在左侧(i - 1th 位置)和右侧(i + 1th 位置)。除了arr[i - 1]arr[i + 1] 之外的元素,不可能获得更小的绝对差异。 (为什么?)

这是一个简单的贪心问题。您必须进行更多练习才能为此类问题提出想法。提出任何想法后,尝试通过矛盾证明归纳证明来验证其正确性。祝你好运!

编辑

排序将占用O(nlogn),并带有一些用于字符串比较的开销。并且迭代以找出差异将需要O(n)。所以时间复杂度总体上将是O(nlog n)

您的想法将采用O(n^2),这在您比较每个元素时要慢得多。

【讨论】:

排序数组是另一个需要时间的操作,所以排序+查找最小差异不会比我的代码花费更多时间吗? @AaqibSoomro 检查更新。我已经接受了这个想法。【参考方案2】:

蛮力意味着您需要做所有可能的解决方案,以验证您的问题是否已解决。

为了避免蛮力,您需要找到一种方法来减少可能的解决方案集,以便尝试更少的解决方案。

【讨论】:

以上是关于如何从蛮力算法转向智能算法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

背包问题Ⅱ——是动态规划还是贪心算法?

在 C++ 中创建蛮力算法 [关闭]

时间复杂度如何从蛮力变为递归解决方案?

人工智能算法综述

允许测试人工智能算法的游戏[关闭]

第16届智能车竞赛双车接力组—直立车经验语录