秒杀排列组合(下)————组合篇

首先为什么要写排列组合?因为排列组合在数学中占有重要的地位,其与概率论也有密切关系;并且排列组合问题在求职的笔试,面试出现的概率特别高,而我在网上又没有搜到比较全面题型的文章;同时,我觉得编写排列组合程序对学习递归也是很有帮助的;当然,最重要的原因是排列组合本身就很有趣!所以就总结下排列组合的各种问法,分两篇写:上篇排列下篇组合



组合篇

排列篇地址:http://blog.csdn.net/nash_/article/details/8351611


首先从各大IT公司的题中总结出排列组合的对象都是整形数组或字符数组,而且绝大部分组合问题都是无重复数字或者字符的;所以组合问题可以按输入数据分为两大类:输入数据有重复无重复,又可以按输出数据分为两大类:输出数据有重复重复


由于侧重点在输入数据无重复,所以先看输入数据无重复类型:


1. 从数组a中,取出n个数的所有组合(不可重复取)

如a={1,2,3}。当n=2时候的所有组合数为12,13,23

算法思想:按递增顺序输出,如12,13,14,15.....23.24.25........34,35.............用一个变量begin遍历的第一个数

代码清单:

public class ZuHe {
	
	public void combine(int[] a, int n) {
		
		if(null == a || a.length == 0 || n <= 0 || n > a.length)
			return;
			
		int[] b = new int[n];//辅助空间,保存待输出组合数
		getCombination(a, n , 0, b, 0);
	}

	private void getCombination(int[] a, int n, int begin, int[] b, int index) {
		
		if(n == 0){//如果够n个数了,输出b数组
			for(int i = 0; i < index; i++){
				System.out.print(b[i] + " ");
			}
			System.out.println();
			return;
		}
			
		for(int i = begin; i < a.length; i++){
			
			b[index] = a[i];
			getCombination(a, n-1, i+1, b, index+1);
		}
		
	}
	
	public static void main(String[] args){
		
		ZuHe robot = new ZuHe();
		
		int[] a = {1,2,3,4};
		int n = 2;
		robot.combine(a,n);

	}

}

2.从数组a中,取出n个数的所有组合(可重复取)

如a={1,2,3}。当n=2时候的所有组合数为11,12,13,22,23,33

算法思想:首先对数组a排序,再利用1的算法,把i=begin,改成i=0,让它每次从0开始遍历,但每个组合都是升序排列,所以为了去重加上升序的判断

代码清单:

import java.util.Arrays;

public class ZuHe {
	
	public void combine(int[] a, int n) {
		
		if(null == a || a.length == 0 || n <= 0 || n > a.length)
			return;
			
		Arrays.sort(a);
		int[] b = new int[n];//辅助空间,保存待输出组合数
		getCombination(a, n , 0, b, 0);
	}

	private void getCombination(int[] a, int n, int begin, int[] b, int index) {
		
		if(n == 0){//如果够n个数了,输出b数组
			for(int i = 0; i < index; i++){
				System.out.print(b[i] + " ");
			}
			System.out.println();
			return;
		}
			
		for(int i = 0; i < a.length; i++){
			
			if(index == 0 || a[i] >= b[index-1]){
				b[index] = a[i];
				getCombination(a, n-1, i+1, b, index+1);
			}
		}
		
	}
	
	public static void main(String[] args){
		
		ZuHe robot = new ZuHe();
		
		int[] a = {1,2,3,4};
		int n = 3;
		robot.combine(a,n);

	}

}


3.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
秒杀系统是一种高并发场景下的典型应用,其设计需要考虑到多方面的因素,包括系统架构、数据库设计、缓存策略、负载均衡等方面。下面是一个简单的秒杀系统设计方案: 1. 系统架构 秒杀系统可以采用分布式架构,将整个系统分成多个模块,包括前端负载均衡、应用服务器、数据库等。前端负载均衡可以使用Nginx或者F5等软硬件负载均衡设备,将请求分发到多个应用服务器上。应用服务器可以采用Tomcat、Jetty等Web容器,处理用户的请求,生成订单,进行库存扣减等操作。数据库可以采用MySQL、Oracle等关系型数据库,也可以采用Redis、MongoDB等NoSQL数据库。 2. 数据库设计 在秒杀系统中,订单和库存是两个非常重要的数据模块。订单表包括订单ID、用户ID、商品ID、购买数量、订单状态等字段。库存表包括商品ID、库存数量、已售数量、锁定数量等字段。在进行秒杀的时候,需要先对库存进行检查,如果库存不足,则无法生成订单。 3. 缓存策略 为了提高系统的并发能力,可以采用缓存策略来减轻数据库的负载。可以将商品的信息和库存数量等放入缓存中,当用户请求到达时,先从缓存中查询数据,如果缓存中没有,则从数据库中查询,并将查询结果放入缓存中。同时,库存扣减操作也需要对缓存进行更新。可以使用Redis等内存数据库作为缓存。 4. 负载均衡 为了平衡系统的负载,可以采用多台服务器进行分布式处理。可以使用Nginx等负载均衡设备将请求分发到多台服务器上,每台服务器处理一部分请求。同时,可以使用分布式锁等机制来保证订单生成的唯一性。 以上是一个简单的秒杀系统设计方案,实际上,秒杀系统的设计需要考虑到多种因素,包括安全性、可靠性、性能等方面,需要根据实际情况进行具体的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值