基础算法之 暴力搜索

算法说明

暴力算法也叫蛮力算法,之所以称为暴力,是因为该算法是枚举当前所有出现的情况,
从而得到需要的情况。该算法可以求的一些情况较少的问题的解,若问题规模太大,该算法便不适用。

算法分析

若给定一个集合 α ,求得该集合的所有子集,求得的子集即为某种情况,列出所有子集及是暴力算法。比如给定一个数组 [1, 3, 5] ,其所有子集为 [ ],[ 1 ],[ 3 ],[ 5 ],[ 1, 3 ],[ 1, 5 ], [ 3, 5 ], [ 1, 3, 5 ] 共八种情况。对于一个元素数量为 n 的集合来说,其子集数目为 2 的 n 次方。证明为: 对于集合中的每个元素,都有选择或者不选择两种情况,则 全部情况为 2 的 n 次方,该证明即为算法的核心。

问题示例

背包问题

给定一定数量的物品,每个物品都有其重量和价值,给定一个容量为 c 的背包,用该背包装物品,求 装的物品价值之和为最大的情况。

问题分析

设集合 A ,其元素为每个物品,利用暴力搜索算法列出集合 A 的所有子集,在其子集中找到物品价值之和最大的情况即可。对于该问题选择的数据结构,在此我用的是一个一维数组存放物品的重量,另一个一维数组存放物品的价值,对应下标即可。

代码示例(C语言)

#include<stdio.h>
int goods_all = 5;                         /* 物品数量  */
int goods_weight[5] = {1, 3, 6, 8, 12};        /* 物品的重量 */
int goods_value[5]  = {1, 4, 8, 10, 20};    /* 物品的价值 */
int package = 20;                          /* 背包容量 */  int maxValue = 0;                          /* 当前最大价值(后面用到)*/
int choose[5];                              /* 存放最优方案的物品下标 *//* 输出结果函数 */
void outputResult() {for (int i = 0; i < goods_all && choose[i] != -1; i++) {printf("重量:%d,价值:%d\n", goods_weight[choose[i]], goods_value[choose[i]]);    }
}/* 存放当前最优方案(不断的更新 choose 数组) @param    goods_list[]       当前的选择项数组@param    goods_num          当前的选择项 数目
*/
void storeChoose(int goods_list[], int goods_num){for (int i = 0; i < goods_all; i++) choose[i] = -1;for (int i = 0; i < goods_num; i++) choose[i] = goods_list[i];
}/* 暴力枚举所有方案(递归实现)@param   goods_list  存放当前方案的数组@param   goods_num   当前选择的物品数目@param   goods_index 当前选择或不选择的物品下标    */
void chooseGoods(int goods_list[],int goods_num, int goods_index){/* 当物品的下标到最后一个物品时,即枚举完毕 ,此时 遍历当前方案 goods_list[], 若当前方案价值大于 当前的 maxValue ,则重写 choose数组 */if (goods_index == goods_all){int value = 0, weight = 0;for (int i = 0; i < goods_num; i++){weight += goods_weight[goods_list[i]];value += goods_value[goods_list[i]];}if (weight <= package && value > maxValue){storeChoose(goods_list, goods_num);maxValue = value;}}else{/* 不选择当前物品 */ chooseGoods(goods_list, goods_num, goods_index + 1); /* 选择当前物品 */ goods_list[goods_num] = goods_index;                goods_num ++;chooseGoods(goods_list, goods_num, goods_index + 1);}
}
int main(){int arr[5];chooseGoods(arr, 0, 0);outputResult();
}

总结

对于暴力搜索,最重要的是对于当前元素的选择或者不选择,在这里能保存数组的多样性是因为下标的原因,因为选择的元素都存在了数组一端。

暴力搜索算法浅显易懂相关推荐

  1. 字符串搜索算法:暴力搜索,KMP

    目录 前言废话 暴力搜索 KMP算法 前言废话    最近脑子有点昏昏沉沉,喝点那种红枣泡的白酒居然神奇的好了一些,感觉很舒服.看来喝少量的酒可以让人更清醒,长期喝可能有养生的效果? 写道这里去百度了 ...

  2. c语言全排列算法_一文学会回溯搜索算法解题技巧

    点击上方蓝字设为星标 下面开始今天的学习- 本文向大家介绍了回溯算法的基础知识,以帮助大家更好地理解回溯算法. 回溯搜索算法简介 维基百科中关于回溯算法的介绍是: 回溯算法(backtracking) ...

  3. k-Anonymity(K匿名)之暴力搜索大法

    k-Anonymity(K匿名)之暴力搜索大法 k匿名 k-Anonymity(K匿名)之暴力搜索大法 写在前面 代码 读取文件 分类 距离矩阵 正向搜索 逆向匹配 匿名化处理 写入文件 实验结果 写 ...

  4. 双指针问题最简单的教程(1)

    什么样的问题适合用双指针技巧?当问题是从一个有序的数组或链表中,找到一个元素的子集,该子集需要满足某种限制. 这时候就特别适合用双指针.这个子集可能是某两个元素,某三个元素,甚至是一个子数组. 1 举 ...

  5. 从60多场技术面试中,我总结了这份面试经验

    选自 | freecodecamp   作者 | Uduak Obong-Eren 转自 | 机器之心   参与 | Panda 如果你致力于成为一名软件工程师或数据科学家,技术面试往往是求职过程中的 ...

  6. 一文搞懂faiss计算

    Faiss的全称是Facebook AI Similarity Search. 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法. 暴力检索耗时巨大,对于一个要求实时人脸识别的应用 ...

  7. 性能服务器解读,【MySQL数据库】第三章解读:服务器性能剖析(上)

    前言: 保持空杯精神,使用性能剖析,专注于测量服务器的时间花费在哪里,思考1.如何确认服务器是否达到了性能最佳状态,2.某条语句为什么不够快,诊断被用户描述为"停顿.堆积.卡死"的 ...

  8. 关联规则挖掘算法_数据挖掘 | 关联规则分析

    1 Introduction 1.1 Problem 频繁模式是频繁出现在数据集中的模式,对于数据分类.聚类.和其他数据挖掘任务有极大的帮助,频繁模式的挖掘成为了一项重要的数据挖掘任务和数据挖掘关注的 ...

  9. 力扣--- 滑动谜题

    力扣- 滑动谜题 文章目录 力扣--- 滑动谜题 一.题目描述 二.问题分析 三.代码 一.题目描述 二.问题分析 对于这种计算 最小步数的问题,我们就要敏感地想到 BFS 算法. 这个题目转化成 B ...

最新文章

  1. windos 2008 vista 下的端口范围改变
  2. 选项卡TabPanel控件
  3. WinAPI: waveInUnprepareHeader - 清除由 waveInPrepareHeader 完成的准备
  4. USB转串口TTL板RX电平异常导致无法收到数据
  5. 动手学深度学习(PyTorch实现)(十)--NiN模型
  6. 线程池异步线程中再次获取线程池资源的问题
  7. IDEA如何导入git仓库的分支代码
  8. ax 2012 随笔
  9. 小米球Ngrok-使用方法
  10. 微信内置浏览器直接下载APK的解决方法
  11. python while循环例题鸡兔同笼_使用函数嵌套和循环枚举解决鸡兔同笼问题(解数学题学Python编程)...
  12. windows7无声音,提示未插入扬声器或耳机的解决
  13. 商城项目 ------ 订单的生成功能(vue实现)
  14. unity Screen.orientation
  15. jQuery 案例-图片抽奖
  16. 裸金属服务器能虚拟化吗,裸金属服务器虚拟化概述
  17. HRNet-v1模型,用于人体形态检测
  18. 新氧,今天受了点儿伤
  19. matplotlib绘制折线图的柱状图
  20. MarkDown的使用教程

热门文章

  1. 看天涯社区如何防验证码接口短信轰炸
  2. 安卓内存监控悬浮窗,面试题解析已整理成文档,含泪整理面经
  3. 2021本科渣渣的春招总结
  4. 2021年1月做算法题记录(Java实现)
  5. 学通信工程考计算机等级证书,通信工程专业可以考什么证书
  6. 模拟LED屏幕文字滚动开发和悬浮
  7. 访问非法内存区和内存泄漏
  8. 机器视觉_工业相机及相关配件选型
  9. 机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载
  10. 欧姆龙r88d系列服务器说明书,欧姆龙R88D/R88M选型使用手册(中文)