软件设计师相关算法
xiao-ren-wu
这个作者很懒,什么都没留下…
展开
-
贪心算法----装箱问题
贪心准则: 1.将一个问题的几步的每一步抽象出公共的最优解 2.一个问题只有一个贪心准则(问题求解时,贪心准则不能改变) 特点 不一定可以产生最优解 好处: 简单快速 需求描述: 有N个物品,体积V1,V2,V3,V4….Vn,若干个体积为v的箱子。 问题:把所有的物品装进箱子中,使得打开的箱子尽量小。 思路: 1.将所有的物品按照体积的降序排列 2.按照箱子的打开顺序遍历已原创 2017-09-03 22:28:16 · 1806 阅读 · 0 评论 -
快速排序(分治算法)
步骤 1.每次将序列中的第一个元素作为一个一个基准, 2.在序列的左边找到第一个比基准元素大的值,在序列的右面找到第一个比序列小的值,交换这两个值,使得在这两个值的两边元素分别小于、大于基准元素。继续在序列中寻找,之后再交换,最终实现在某个位置,该元素的值(包括该元素)都比基准元素小,该元素的右面的元素值都比基准元素大。将这个值和基准元素进行交换,实现在基准元素的左边,元素值都比基准元素小,基准原创 2017-10-20 13:24:01 · 1304 阅读 · 0 评论 -
马踏棋盘(回溯算法)
马可以走的位置如图: 要求: 找到所有马从任意一个位置出发遍历整个棋盘的一条路径 算法实现:#include<stdlib.h>#include<stdio.h>int chessboard[12][12];//定义棋盘,//马走的方向int move[8][2] = { { 2, 1 }, { 1, 2 }, { -1, 2 }, { -2, 1 }, { -2, -1 }, { -1原创 2017-10-05 13:40:52 · 2278 阅读 · 0 评论 -
迷宫(回溯算法)
要想解决迷宫问题,首先搞明白八皇后,迷宫问题是回溯和贪心的产物。 题目:现有一个迷宫如图: 黄色五角星为迷宫的起点,红色五角星为迷宫的终点。 要求:找到从起点到终点的所有路线。 思路:我们的目的为了到达终点,所以一定要向着终点的方向出发。 因为迷宫的终点在起点的右下角。 所以我们选择路径时先考虑向下走, 走不通考虑向右走, 走不通考虑向上, 最后考虑向左。 这样就会总有一次到原创 2017-10-05 13:29:43 · 2729 阅读 · 0 评论 -
求序列中最大子序列和(分治算法)
分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 分治思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成原创 2017-10-09 10:28:40 · 9682 阅读 · 0 评论 -
Huffman编码(二)链表实现
链表实现哈夫曼编码相比数组比较简单。//创建哈夫曼节点typedef struct node{ char word; int weight; struct node *left, *right;}HuffmanNode;//创建哈夫曼树HuffmanNode* creatHuffmanTree(char word[], int weight[]){ int l原创 2017-09-19 00:34:08 · 790 阅读 · 0 评论 -
Huffman编码(一)数组实现
哈夫曼编码简介: 一定能获得最优解的算法。 应用领域:压缩 知识扫盲 1.节点的权(W):赋予叶子节点有意义的值 2.节点的路径长度(L):从根几点到当前节点的边的个数。 3.节点的带权路径长度:W*L 4.一棵二叉树的带权路径长度:所有叶子节点的带权路径长度之和 哈夫曼树(最优二叉树) 一棵二叉树的带权路径长度之和最小。原创 2017-09-18 01:09:31 · 1331 阅读 · 0 评论 -
八皇后问题
问题描述 在8*8的国际象棋棋盘中,摆放8个皇后,使得每一行、每一列、每一条斜线上都只有一个皇后。 问题分析 先在第一行的第一个位置摆放第一个皇后 接着在第二行顺序查找摆皇后的位子 以此类推: 下一行没有符合摆放皇后的位置。说明上一行摆放的皇后位置不合适。返回上一行重新摆放皇后。(开始回溯) 当前行依旧摆放不了皇后,继续回溯 以此类推直到八个皇后都放到棋盘上。原创 2017-09-25 12:31:57 · 321 阅读 · 0 评论 -
hash存储
采用拉链法进行存储#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//创建链表节点typedef struct node{ int data; struct node *next;}ElemSN;ElemSN** hash(int data[], int n, int len){原创 2017-08-29 20:40:31 · 265 阅读 · 0 评论 -
归并排序(分治算法)
之前分享过一道算法叫做:寻找一个序列中的最大子序列和,如果那个算法想通了,那么归并排序开起来会显得比较简单 归并算法基本思路 将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。综上可知:归并排序其实要做两件事:(1)“分解”——将原创 2017-10-31 08:55:58 · 3821 阅读 · 0 评论