蛮力法

蛮力法就是以最直观、最直接,从头到尾,从上到下的思维去尝试解决问题。

它主要包括以下三种方式:

  1. 一个一个地解决:冒泡排序
  2. 尝试所有可能的迭代:顺序查找、模式匹配
  3. 尝试所有的排列组合:最近点对、背包问题
// 冒泡排序
void bubble_sort(array[0,..,n]) {
    for i=0 to i=n-2:               // i表示冒第几个泡
        for j=0 to j=n-2-i:
            if array[j] > array[j+1]:
                swap(array[j], array[j+1])
}
/*
 * 模式匹配
 * 直接思路:
 *      蛮力法,一个个元素比较;不成功后,再往后移动一位,继续比较
 */
#include <string>
using namespace std;

void matchPatternByForce(string str, string pattern) {
    str_ptr = str.begin(), pattern_ptr = pattern.begin();
    while (str_ptr != "\n")
        str_ptr_tmp = str_ptr;
        while (pattern_ptr != "\n")
            if (*str_ptr++ != *pattern_ptr++)   break;
        if (pattern_ptr == "\n")        return str_ptr-str.begin();
        str_ptr++;

    return -1;
}
/*
 * 背包问题
 * 思路:
 *      蛮力法:总排列数是2的n次方;通过位图表示,来确定每一个元素是否存在组合中
 */

#include <vector>
#include <iostream>
#include <string>

using namespace std;

/* 蛮力法 */
int findFittestByBitMap(capacity, things[0, n]) {
    allPossbilities = 2 << n;
    for loop_num=0 to loop_num=allPossbilities:
        bit_pos = 0;
        sum_value = 0;
        max_value = 0;
        while loop_num > 0:
            bit_value = loop_num % 2;
            loop_num = loop_num / 2;
            if bit_value:
                sum_value += bit_value;

        if sum_value <= capacity && sum_value > max_value:
            max_value = sum_value;

    return max_value;
}
时间: 2024-08-30 12:43:54

蛮力法的相关文章

算法笔记_009:字符串匹配【蛮力法】

1 问题描述 给定一个n个字符组成的串(称为文本),一个m(m <= n)的串(称为模式),从文本中寻找匹配模式的子串. 2 解决方案 2.1 具体编码 package com.liuzhen.chapterThree; public class BruteForceStringMatch { //根据文本串N,和模式串M,返回第一个匹配模式串的子串在N中的位置 public static int getStringMatch(int[] N , int[] M){ int n = N.leng

算法笔记_008:选择排序和冒泡排序【蛮力法】

目录 1 问题描述 2 解决方案 2.1 选择排序原理简介 2.2 具体编码(选择排序) 2.3 冒泡排序原理简介 2.4 具体编码(冒泡排序) 1 问题描述 给定一个可排序的n元素序列(例如,数字.字符和字符串),将它们按照非降序方式重新排列. 2 解决方案 2.1 选择排序原理简介 选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素和第一个元素交换位置:然后,我们从第二个元素开始扫描剩下的n-1个元素,找到这n-1个元素中的最小元素,将最

算法-蛮力法

---恢复内容开始--- 特点: 第一,和其他某些策略不同,我们可以应用蛮力法来解决广阔领域的各种问题.(应用领域广) 第二,对于一些重要的问题来说(比如:排序.查找.矩阵乘法和字符串匹配),蛮力法可以产生一些合理的算法,它们多少具备上些实用价值,而且并不限制实例的规模. 第三,如果要解决的问题实例不多,而且蛮力法可以用一种能够接受速度对实例求解,那么,设计一个更高效算法所花费的代价很可能是不值得的.(代价相对较小) 第四,即使效率通常很低,仍然可以用蛮力法解决一些小规模的问题实例.(适合小规模

KMP算法(蛮力法)

1 #include<stdlib.h> 2 #include<stdio.h> 3 void next(char T[],int nextArr[],int n); 4 5 int match(char S[],int tn,char T[],int sn,int nextArr[]); 6 7 int main(void){ 8 char S[]="adefdfeeeeeeeeeabcdefgabcdefgaeiohxohoalslhoe"; 9 char

leetcode[169] Majority Element

在一个数组中找到主要的元素,也就是出现次数大于数组长度一半的元素. 我想到的方法是 1. 排序,然后扫描一次就知道了.总共nlgn 2. 哈希,记录每个次数,O(n)的时间和空间. class Solution { public: int majorityElement(vector<int> &num) { unordered_map<int, int> umap; for (int i = 0; i < num.size(); i++) { umap[num[i]

删除字符串中重复的字符

描述 分析 方法一,蛮力法.两个循环,大循环每次从数组中取出一个字符,小循环重新遍历该数组是否含有该字符.方法二:排序法.对两个字符串的字符进行排序,再比较.方法三:空间换时间.acsII共256个字符.使用256bit记录每个字符是否已出现过.遍历字符串,若已出现过则将该字符替换为'\0'方法四:正则表达式."(?s)(.)(?=.*\\1)" 代码 方法三,空间换时间. public class Test { public static String removeDuplucate

求字符串中第一个只出现一次的字符

问题描述:给定一个字符串,假设字符串中只包含字母和数字,求出这个字符串中第一个只出现一次的字符. 分析:这个题目想要做出来还是比较简单的,关键是如何用高效的方法求解.这里我提供两种方法: 解法一:蛮力法.具体思想为,从第一位开始,拿每一位和后面的每一位进行比较,如果没有出现,则直接输出这个字符. 如果出现,则从第二位开始,再和后面的每一位进行比较,依次类推. 算法的时间复杂度为O(n^2). 解法二:哈希法.采用两次扫描即可实现.需要提前构建一个哈希表,把字符当成key值,把出现的次数当成val

最大和子数组/最大和子序列

最大和子数组是数组中和最大的子数组,又名最大和子序列.子数组是数组中连续的n个元素,比如a2,a3,a4就是一个长度为3的子数组.顾名思义求最大和子数组就是要求取和最大的子数组. n个元素的数组包含n个长度为1的子数组:{a0},{a1},…{an-1}: n个元素的数组包含n-1个长度为2的子数组:{a0,a1},{a1,a2},{an-2,an-1}: ……………………………………………………………………………………………… n个元素的数组包含1个长度为n的子数组:{a0,a1,…,an-1

A tutorial on Principal Components Analysis | 主成分分析(PCA)教程

A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components Analysis, February 26, 2002. 翻译:houchaoqun.时间:2017/01/18.出处:http://blog.csdn.net/houchaoqun_xmu  |  http://blog.csdn.net/Houchaoqun_XMU/article/details