㈠ 高手请进,数据结构问题,寻找最优最全的算法
把你这些数据全部导入一个数据库,几个SQL几下就得出结果了。
㈡ 从100万数据中找出最大10条的最优算法
我面试的时候有问到过,因为数据量很大,所以要同时考虑空间问题。标准答案是采用堆排序。
具体做法是:
构建一个只有10个元素的min-heap,那么根结点就是这10个数中最小的数,然后开始遍历数组,如果遇到的数比min-heap的根结点还小,直接跳过,遇到比min-heap根结点大的数,就替代根结点,然后对这个min-heap进行维护(也就是排序,保证heap的特征)。那么遍历完数组后,这个min-heap的10个元素就是最大的10个数。
关于堆排序的代码应该不难找
㈢ cplex求最优解和算法求解,哪个更好二者有什么区别吗
需要根据你的问题特性,算法求解还涉及到你用的具体算法,可以用现在已有的算法,也可以自己写算法,这些都会影响到求解的效果,不能简单一句cplex和算法比较哪个优劣。
而且根据规划的不同,使用的软件以及方法也会有差别。
cplex可以求导最优解,但大规模的话可能时间会长。
㈣ 寻求最优最快的算法,快速找出某一数组中符合条件的子集(如最大的100个)
我记得这个再算法分析里面我学过,多种排序方法里面,时空效率最高的应该是堆排序
堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
堆排序的算法:
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
int i;
BuildHeap(R); //将R[1-n]建成初始堆
for(i=n;i>1;i--){ //对当前无序区R[1..i]进行堆排序,共做n-1趟。
R[0]=R[1];R[1]=R[i];R[i]=R[0]; //将堆顶和堆中最后一个记录交换
Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质
} //endfor
} //HeapSort
㈤ 请问数钱的贪婪算法怎样确保得到最优解
贪婪算法:总是作出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。
(注:贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解。但其解必然是最优解的很好近似解。
基本思路:——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
基本要素:
1、 贪婪选择性质:所求问题的整体最优解可以通过一系列局部最优的选择,即贪婪选择来达到。(与动态规划的主要区别)
采用自顶向下,以迭代的方式作出相继的贪婪选择,每作一次贪婪选择就将所求问题简化为一个规模更小的子问题。
对于一个具体问题,要确定它是否具有贪婪选择的性质,我们必须证明每一步所作的贪婪选择最终导致问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪婪选择开始的,而且作了贪婪选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪婪选择,最终可得到问题的一个整体最优解。
2、最优子结构性质:包含子问题的最优解
1、 设有n个活动的安排,其中每个活动都要求使用同一资源,如演讲会场,而在同一时间只允许一个活动使用这一资源。每个活动都有使用的起始时间和结束时间。问:如何安排可以使这间会场的使用率最高。
活动 起始时间 结束时间
1 1 4
2 3 5
3 0 6
4 5 7
5 3 8
6 5 9
7 6 10
8 8 11
9 8 12
10 2 13
11 12 14
算法:一开始选择活动1,然后依次检查活动一i是否与当前已选择的所有活动相容,若相容则活动加入到已选择的活动集合中,否则不选择活动i,而继续检查下一活动的相容性。即:活动i的开始时间不早于最近加入的活动j的结束时间。
Prodere plan;
Begin
n:=length[e];
a {1};
j:=1;
for i:=2 to n do
if s[i]>=f[j] then
begin a a∪{i};
j:=i;
end
end;
例1 [找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪婪准则如下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。
假设需要找给小孩6 7美分,首先入选的是两枚2 5美分的硬币,第三枚入选的不能是2 5美分的硬币,否则硬币的选择将不可行(零钱总数超过6 7美分),第三枚应选择1 0美分的硬币,然后是5美分的,最后加入两个1美分的硬币。
贪婪算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习1)。
㈥ 用什么算法解决最优算法比较合适
问题是线性的,还是非线性的。线性的,分枝定界、分枝割平面、分枝定价、列生成等算法都可以求解;非线性的,还要分是否凸,凸的话,广义Benders分解、外部近似、分枝定界、扩展割平面算法等,非凸的话,可采用全局最优算法。判断一下是否是凸规划,是的话,用上面的算法可以求到全局最优;否则,可能得到局部最优解。
㈦ 找一种可以帮人从几种方案里面选择最优的算法
如果找一种可以帮人充几种方案,里面选择最悠闲的算法是我觉得是很困难的
㈧ 请高手:求最优解算法!!!题目如下:
个人的理解,程序可能会花点时间写。
定义数组 a(m,n)
该问题的数学模型应该如下
z=min(a(1,1)+a(1,2)+……+a(m,n))即所用的机器人最少
约束条件是:
a(i,j)=0或者1(当等于0时表明此格不安放机器人,1则表示安装i=1,2…m j=1,2…n)
a(i-1,j)+a(i+1,j)+a(i,j-1)+a(i,j+1)>=1 前后左右至少有一个机器人,i=1,2…m j=1,2…n)。当然,当i-1=0,j-1=0 ,i+1>m,j+1>n 四情况下a(i-1,j) =0 a(i+1,j)=0 a(i,j-1)=0 a(i,j+1) =0 此时即边角陈列室的情况,因为处于边上的陈列室,其前后左右一边或2边没有其他陈列室,因此不可能设置
监视。
该问题的求解,我觉得可以用运筹学的0,1规划,具体你可以查查资料看看。
祝你成功!
㈨ 类似01背包问题。银行有1、2、3、4、5、6元共六种货币,两个抢匪抢银行共抢到了N张,判断二人是否能平分
不知道N的范围,一种很暴力的方法。
问题可以转化成能不能分别用x和y张货币构成sum/2.
dp[money][cnt]表示能否用cnt张构成总额为money的钱。
dp[money][cnt]|=dp[money-i][cnt-1] (1<=i<=6)
dp[0][0]=1;
最后判断dp[sum/2][x]和dp[sum/2][y]都为1就可以了。当然sum本身是奇数就一定不可以,不用跑DP了。
㈩ 强盗劫匪电影,如抢银行电影或小说
《新警察的故事》这个有点夸张但绝对精彩。
《偷天换日》《雌雄大盗》《邦妮和克莱德》等