数据结构/算法
Baocai3000
技术源于需求又高于需求
展开
-
算法与追mm
<br />TRACEBACK:http://sl.iciba.com/viewthread-31-349020-1.shtml<br /> <br />动态规划<br /><br /> 你追一个MM的时候,需要对该MM身边的各闺中密友都好,这样你追MM这个问题就分解为对其MM朋友的问题,只有把这些问题都解决了,最终你才能追到MM。<br /><br /> 该方法适用于聪明的MM,懂得“看一个人,不是看他如何对你,而是看他如何对他人。”的道理,并且对付这样的MM总能得到最优解。<br /><br />原创 2010-07-08 20:13:00 · 572 阅读 · 0 评论 -
Randomized Algorithm
Randomized Algorithm原创 2010-07-09 11:34:00 · 891 阅读 · 0 评论 -
Multithreaded Algorithms[1]
Multithreaded Algorithms原创 2010-07-09 18:05:00 · 747 阅读 · 0 评论 -
CLRS[1]:general concept
CLRS[1]:general concept原创 2010-07-09 23:08:00 · 633 阅读 · 0 评论 -
我的C算法库【1】
我的C算法库【1】原创 2010-07-10 02:26:00 · 865 阅读 · 0 评论 -
我的C算法库【3】:MERGE_SORT
我的C算法库【2】:MERGE_SORT原创 2010-07-14 20:45:00 · 796 阅读 · 0 评论 -
我的C算法库[5]:实现数据结构ArrayList
我的C算法库[5]:实现数据结构ArrayList原创 2010-07-15 21:18:00 · 739 阅读 · 0 评论 -
我的C算法库【4】:HEAP_SORT
我的C算法库【4】:HEAP_SORT原创 2010-07-14 22:44:00 · 734 阅读 · 0 评论 -
动态规划 VS 分治
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复原创 2010-07-19 19:48:00 · 605 阅读 · 0 评论 -
海量数据处理常用思路和方法
大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。 1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,原创 2010-07-23 10:00:00 · 665 阅读 · 0 评论 -
笔试题
1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)int a = 4;(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);a = ?答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;改后答案依次为9,10,10,112.某32位系统下, C++程序,请计算sizeof 的值(5分).char str[] = “http://www.ibegroup.原创 2010-07-23 10:07:00 · 596 阅读 · 0 评论 -
《编程之美3.1:字符串移位包含问题》
<br />给定两个字符串s1和s2,要求判定s2是否能够通过s1循环移位得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。<br />/* ============================================================================ Name : Strstr.c Author : QiBaoyuan Version :原创 2010-08-13 15:00:00 · 653 阅读 · 0 评论 -
找出一堆树中最小的k个数
找出一堆树中最小的k个数,使用multiset来组成一个大顶堆。原创 2010-08-14 13:06:00 · 660 阅读 · 0 评论 -
大整数加法
大整数加法原创 2010-08-13 15:56:00 · 649 阅读 · 0 评论 -
带min函数的栈
带min函数的栈,采用两个deque模仿stack,一个存放所有的压栈值,另一个存放最小的index.由于需要用到随机访问,因此,用双端队列来作为基础容器,为每个新元素配备一个最小元素索引,出栈对应着最小元素索引出栈,入栈时先比较一下,在入队列,设置最小索引队列。原创 2010-08-14 17:21:00 · 728 阅读 · 0 评论 -
求一个数组的子数组的最大的和
求一个数组的子数组的最大的和假设已经知道(A[1],A[2]...A[n-1])中和最大的一段之和为All[1],且知道(A[1],A[2]...A[n-1]) * 包含A[1]的和最大的一段和为Start[1],那么ALL[0]=max(A[0],A[0]+Start[1],All[1]);符合动态规划的 * 无后效性,可以使用动态规划原创 2010-08-14 19:28:00 · 1024 阅读 · 0 评论 -
double与string的相互转化(C++)
double与string的相互转化(C++)原创 2010-08-14 21:58:00 · 15767 阅读 · 1 评论 -
STL中set、map的比较函数
STL中set、map的比较函数原创 2010-08-14 22:52:00 · 2357 阅读 · 1 评论 -
和为n的连续正整数序列
small=1,big=2;若之和大于sum,则去掉小的small;若小于sum,则去掉big的值。原创 2010-08-17 23:45:00 · 899 阅读 · 0 评论 -
排列数组使得偶数在奇数的前面
排列数组使得偶数在奇数的前面。两个指首位针,前进与后退。原创 2010-08-18 00:08:00 · 766 阅读 · 0 评论 -
测试单链表是否有环,并找到入口
测试单链表是否有环,并找到入口:快慢指针,当两个指针相遇时存在环,并将快指针移动到头部单步移动,球最后的相遇点即可。原创 2010-08-19 11:18:00 · 674 阅读 · 0 评论 -
左旋转n位字符串
左旋转n位字符串原创 2010-08-17 22:35:00 · 681 阅读 · 0 评论 -
要寻找一个单链表的中间节点
要寻找一个单链表的中间节点(1) 使用两个指针进行遍历,快指针每次步进2,慢指针每次步进1;(2) 当快指针到达链表尾部的时候,慢指针指向的就是链表的中点。原创 2010-08-19 11:16:00 · 1367 阅读 · 1 评论 -
[编程之美]寻找发贴水王Tango
<br />//============================================================================// Name : Tango.cpp// Author : qibaoyuan// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//=====原创 2010-08-23 10:13:00 · 1054 阅读 · 0 评论 -
12个高矮不同的人,排成两排
作者:baihacker 来源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker 问题描述: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 这个笔试题,很YD,因为把某个递归关系隐藏得很深. 问题分析: 我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排. 用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种转载 2010-08-23 10:25:00 · 1003 阅读 · 0 评论 -
算法思想
<br />1.判断两个排好序数组中是否存在相同的数字:有一个 O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。<br />2.两个排好序数组的in-place merge<br />假定给你两个已经排好序的数组,为了简单起见,长度为都n,要求在不使用额外空间的前提下,把两个原创 2010-08-23 15:26:00 · 630 阅读 · 0 评论 -
memmove
// MemMove.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include void* memmove1(void* dest,void *src,size_t count){ assert(dest!=NULL && src!=NULL); void *ret=dest; if (原创 2010-08-23 21:08:00 · 619 阅读 · 0 评论 -
【百度面试题】循环有序数组的查找问题
问题:有一个循环有序数组A,如{7,8,9,0,1,2,3,4,5,6},不知道其最小值的位置。那么如何从这样的数组中寻找一个特定的元素呢?解决:当然,遍历总是一个办法。当然面试的时候回答遍历估计就直接杯具了。我的想法是将原数组分段,用首元素s,中间元素m和尾元素e,可以将数组分为两个子数组s1,s2,那么,必然有至少一个子数组是有序的。那么如何确定那一段是有序的呢?通过分析可以看到只有3种情况:●当s就是A中最小的元素时,以下不等式成立: s ●当最小值位于(s, m]时,则有: m ●当最小值出现在转载 2010-08-23 15:28:00 · 627 阅读 · 0 评论 -
添加节点到单链表某个节点的前面
<br />基本思路:交换欲插入节点的值和该节点的值,然后按照正常的节点插入即可。<br /> //添加新节点到mid的前面 Node *node=(Node*)malloc(sizeof(Node)); node->value=90; //保存插入节点的值 int value=node->value; node->value=mid->value; mid->value=value; //穿起来 Node* next=mid->next; mid->n原创 2010-08-25 19:32:00 · 927 阅读 · 0 评论 -
几个动态规划的常见例题
<br /><br />原贴地址:http://www.cnblogs.com/dmesg/archive/2009/07/31/1535772.html<br />1.LIS(Longest increase string)<br /><br />( 3,-1,2,4,9,6)<br />LIS的考虑是当前点和前面最长递增子序列的最大值比较或者与次最长递增子序列的最大值比较或者与次次最长递增子序列的最大值比较。。。。。。这时的复杂度为O(n^2)。倘若用二分法查找这个“合适的最长递增子序列最大值”,复杂度转载 2010-08-24 19:36:00 · 855 阅读 · 0 评论 -
求N的N次方的最高位
http://www.cnblogs.com/dmesg/archive/2009/08/02/1536997.html我想知道怎么求N的N次方,这个数据是很大的,但是我要的是这个数据的最高位的数,应该有什么好的方法吧! 请大侠们帮帮忙吧!!(N 这个问题提出后,fallening同学便很快的在五分钟内作出了解答log_10(N^N)=N*log_10(N) 因此,log_10(N)的第一位就是你要求的:)我在三楼看的很疑惑,于是向同学提出问题,一天之后他给出解答N^N=10^(Nlog(N))=10^(l转载 2010-08-24 19:51:00 · 2887 阅读 · 1 评论 -
有10亿个整数,要求选取重复次数最多的100个整数
要解答这个问题,首先要弄清楚下面几个条件。(1)有内存限制吗?(2)整数的范围是多少?有符号,无符号,32位还是64位?(3)整数集的内容大吗?(即出现的整数空间的大小大吗?)(4)如果只需要求模糊解,怎么解?(5)求数组中的第k大元素?(6)相关问题:求一个整数列中出现次数最多的整数(7)相关问题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。(1)如果没有内存限制,且假设是32位无符号的整数。最方便的办法就是建立一个整形数组,int hash[2^32](原创 2010-08-28 21:03:00 · 1335 阅读 · 0 评论 -
拓扑排序
<br />一.定义 <br /><br />对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序(Topological Sort),是将G中所有顶点排成一个线性序列,使得对图中任意一对顶点u和v,若<u,v>∈E(G),则u在线性序列中出现在v之前。通常将这样的线性序列称为满足拓扑次序(Topolgical Order)的序列,简称拓扑序列。 <br /><br />二.算法 <br /><br />1.无前趋的顶点优先: <br /><br />(1)算法描述: <原创 2010-08-29 00:03:00 · 559 阅读 · 0 评论 -
【百度面试】兄弟词
给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。Ans:(1)使用hash_map和链表。首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo。使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。开始时,先遍历字原创 2010-08-29 23:15:00 · 1072 阅读 · 0 评论 -
【算法导论】33.2:判断任意两条线段是否相交
<br />1.基本方法:扫描线法(sweeping),垂直扫描线,只是可以判断是否相交,而不能打印交点。扫描线自左向右,x轴看作是时间,两个假设:(1)没有垂直的线段(2)没有三条线段交与一点。<br />2.如果不相交,则对于处于任何位置的扫描线,两条线段的指间的比较关系式不变的。<br />3.使用的数据结构:(1)扫描线状态:给出相交的object的关系;(2)x轴上的扫描点为时间点序列。<br />4.使用红黑树。原创 2010-08-30 15:52:00 · 3353 阅读 · 2 评论 -
常用数据结构及其应用总结
<br />1、栈:<br /> <br /> <br />1、后缀表达式的求值;<br />2、中缀到后缀表达式的转换;<br />3、深度优先搜索的非递归实现;<br />4、动态规划的优化:用于维护一个凸序列,便于二分查找,如LIS问题的O(nlgn)算法。<br /><br />2、队列:<br />1、树的层序遍历;<br />2、广度优先搜索;<br />3、Bellman-Ford算法的SPFA实现;<br />4、网络流中FF算法的Edmonds-Karp实现,以及Preflow算法的队列优原创 2010-08-27 22:28:00 · 858 阅读 · 0 评论 -
[腾讯面试]有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数
<br />描述:有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数。(不准用位图!!)<br />位图解决:<br />位图的方法如下<br />假设待处理数组为A[10w-2] <br />定义一个数组B[10w],这里假设B中每个元素占用1比特,并初始化为全0 <br />for(i=0;i <10w-2;i++) <br />{ <br /> B[ A[i] ]=1 <br />} <br />那么B中为零的元素即为缺少的数据<br />这种方法的效率非常高,是计算机中最常用的算法之一<原创 2010-08-28 19:45:00 · 3335 阅读 · 2 评论 -
m表示为一些不超过n的自然数之和
<br />/*设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。例:f(5,3)=5,有五种表示方式:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1*/int f(m,n) int m,n;{ if(m==1)return 1; if(n==1)return 1; if(m<n) return f(m,m); if(m==n)return 1+f(m,n-1); return f(m,n-1)+f(原创 2010-08-30 00:15:00 · 2671 阅读 · 1 评论 -
【算法导论】33.3:寻找凹包(Convex Hull)P:947
1.凹包的定义:将集合Q中所有点都包含的最小多边形,每个点或者在其边上或者在其内部。2.运用:计算二维空间中两个最远的两个点(比在是凹包的点)3.两种方法:(1)Graham‘s scan,采用栈S,首先寻找y点最低或者最左的点,然后排序极角:for i do while the angle formed by points Next-To-Top(S),Top(S),and pi makes a nonleft turn do pop(S) push(pi,s)notice:每次必原创 2010-08-30 09:57:00 · 9436 阅读 · 3 评论 -
【算法导论】33.1:线段的属性
<br />1.判断相对属性:计算交叉积p1xp2=(x1*y2)-(x2*y1),如果为正,则为clockwise,否则为counterclockwise。<br />2.判断交叉点是左转还是右转:计算p0p1与p1p2在p1点的转向问题。我们需要计算p0p2与p0p1的交叉积即可,如果为正,则为顺时针,因此左转,否则右转。<br />3.判断两条线段是否相交:经典方法,就是跨立试验了,即如果一条线段跨过另一条线段,则线段的两个端点分别在另一条线段的两侧。但是,还需要检测边界情况,即两条线段中可能某条线段原创 2010-08-30 11:58:00 · 1254 阅读 · 0 评论