数据结构
文章平均质量分 59
silentsharer
Less is More
展开
-
C++大数问题
1. 大数相加 1、从结尾开始每位相加 2、两个整数长度不相等(肯定有一个已经加完了,再把没有加完的加上去) 3、最高位有进位,要再进一位 4、结果字符串逆序2. 大数相乘 - 分析 12*34=? 乘数:12 被乘数:34 1、先把乘数列出来,第i行列左起第i位数,列N次(N为乘数的位数) 第二行起每次右移一位(1) (1) (2) (2)2、写入被乘数,按先列后行的原创 2016-05-02 21:00:50 · 2855 阅读 · 3 评论 -
二维数组中的查找
问题描述: 在一个二维数组中,每一行都是按照从左向右递增的顺序排序,每一列都是按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数 题目分析: 在分析这个问题的时候,很多人都会把二维数组画成矩形,然后从数组中选取一个数字,分3中情况来分析查找过程。(1)当数组中选取的数字刚好和要查找的数字相等时,就结束查找过程。(2)如果选取的数字小于要查原创 2016-05-02 20:57:40 · 546 阅读 · 0 评论 -
String类赋值运算符函数
题目:如下类型CMyString的声明,请为该类添加赋值运算符函数class CMyString{public: CMyString(char* pdata = NULL); CMyString(const CMyString& str); //赋值函数 CMyString& operator=(const CMyString& str); ~CMyStr原创 2016-06-01 22:22:54 · 1156 阅读 · 0 评论 -
N皇后问题
1. 问题描述: N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击) 本人使用的是回溯法,另外还有高效的解法见转载的博客2. Code#include <iostream>#define N 20using namespace std;bool arr[N][N] = {0}; int count = 0;原创 2016-06-03 22:49:57 · 672 阅读 · 0 评论 -
N皇后的两个最高效的解法
1. 问题描述 N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)2. 回溯法求解N皇后 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优转载 2016-06-03 23:09:54 · 9904 阅读 · 0 评论 -
模拟扑克牌的洗牌发牌
在内存中模拟出一副牌,然后模拟洗牌,发牌等动作 流程:构建一副牌保存到一个数组中–>洗牌–>创建玩家–>向玩家发牌–>输出每个玩家的牌#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <malloc.h>//一副牌的数量 #define CARD_COUNT 54 //定义扑原创 2016-06-19 21:57:41 · 4546 阅读 · 0 评论 -
三种快排及四种优化方式
1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元原创 2016-08-10 20:46:31 · 38616 阅读 · 10 评论 -
Fibonacci数列优化以及应用
斐波那契数列是一个非常美丽、和谐的数列,也是一个黄金分割数列。符合黄金分割比0.618。有人说它起源于一对繁殖力惊人、基因非常优秀的兔子,也有人说远古时期的鹦鹉就知道这个规律。 每一个学理工科的学生都知道斐波那契数列,斐波那契数列由如下递推关系式定义: F(0)=0, F(1)=1, n>1时,F(n)=F(n-1)+F(n-2)。下面简单地分析一下常见的Fibonacci数列求解算法 1、递原创 2016-08-09 21:47:46 · 1207 阅读 · 0 评论 -
字符串哈希函数
链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。 设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性转载 2016-08-08 22:11:59 · 1431 阅读 · 0 评论 -
KMP算法
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake原创 2016-08-08 21:52:40 · 492 阅读 · 0 评论 -
2种二分查找及2种优化方式
题目1:经典算法—二分查找 折半查找的基本思想:减小查找序列的长度,分而治之的进行关键字的查找。该序列必须是有序的。 查找过程是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功;若给定的值小于中间记录的关键字,则在中间记录的左半区间继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区间继续查找;不断重复这个过程,直到查找成功。否则查找失败实现:通常设置原创 2015-09-06 22:13:26 · 12642 阅读 · 5 评论 -
线性表
1. 线性表综述: 线性表是具有相同特性数据元素的一个有限序列 该序列中所包含元素的个数叫做线性表的长度 当一个线性表有序时,成为有序表,属于逻辑结构 线性表的逻辑特征: 对于至少含有一个元素的线性表来说 除起始元素没有前驱元素外,其他元素都有一个唯一前驱 除终端元素没有后继元素外,其他元素都有一个唯一后继 在线性表中,每个元素最多只有一个前驱和后继元素 线性表存储结构:原创 2016-06-18 11:08:55 · 1844 阅读 · 0 评论 -
哈希表(HashTable)
1. 哈希表综述: 哈希表(Hash Table)也叫散列表,是根据关键码值直接访问 就是一个把关键码映射到表中的一个位置来访问记录的过程 这个映射函数叫做哈希函数,用hash()表示,存放记录的数组叫做哈希表(一个数组) 哈希表是一种高效的数据结构,主要体现在数据的查找上,几乎可以看成常数时间 例如:对于排序算法,最低时间复杂度为O(nlogn),但是对于一些特殊情况可以更快,现有N个原创 2016-06-03 21:42:50 · 692 阅读 · 0 评论 -
并查集(UnionSet)
1. 前述: 在一些有N个元素的集合应用问题中,通常是在开始时让每个元素构成一个单元素的集合,然后按照一定顺序将属于同一组的元素所在的集合合并,期间要反复查找一个元素在哪个集合中,这类题目看似并不复杂,但是数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受,即使空间勉强通过,时间复杂度也极高,只能采取一种特殊的数据结构——->并查集2. 并查集初始化: 一般用树形结构来原创 2016-06-03 21:27:51 · 2002 阅读 · 0 评论 -
选择排序Select Sort
经典排序算法 — 选择排序Select Sort原理:选择排序的思想非常直接,我就从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。不过条条大路通罗马,两者的目的是一样的。 注意:先从剩下的元素中找到最小的后再交换值,而不是比较原创 2015-08-29 20:32:53 · 676 阅读 · 0 评论 -
大数据之一般解决方法
处理海量数据问题,就是: 1、分而治之/hash映射 + hash统计 + 堆/快速/归并排序 2、Bloom filter/Bitmap 3、Trie树/数据库/倒排索引 4、外排序 5、分布式处理之hadoop/mapreduce接下来的部分,便针对这5种方法模式结合对应的海量数据处理面试题分别具体阐述。密匙一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序1、海量日转载 2016-05-02 21:44:49 · 664 阅读 · 1 评论 -
冒泡排序Bubble Sort
经典排序算法 — 冒泡排序Bubble Sort原理是相邻的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子:从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环)第一次两两比较6 > 2交换(内循环)交换前状态| 6 |原创 2015-08-29 19:48:58 · 646 阅读 · 3 评论