当前位置: 首页 > 科技观察

代码需求?这不就是产品给我留的数学作业吗!

时间:2023-03-13 23:20:10 科技观察

内容1.前言2.代码是数理逻辑的具体实现3.8位随机抽奖码的设计推物(毒)1.需求描述2.实施方案4.总结1.前言图15-1完成核心代码为什么你的代码这么乱?它实际上来自于你有这么多的事实。为什么要写这样的代码!为什么你的代码中有这么多for循环?因为没有合理的数据结构和算法逻辑。为什么你的代码中有这么多ifel?因为缺乏将设计模式应用到业务场景中。为什么您的应用程序复杂且难以连接?因为没有很好的系统架构拆分和规划。为什么你的程序逻辑开发交付缓慢和返工?因为你没有某些业务场景的开发经验。为什么你的节目介绍看起来很不人道?因为没有产品思维是程序员逻辑的体现。“最后”,所有这些不合理的东西交织在一起,就是一坨代码你看得见!“所以”,如果你想把代码写的又好又漂亮,并且写到你愿意反复欣赏,那你基本上需要有一定的:基础能力(数据结构、算法逻辑、设计模式)、应用能力(系统架构、开发经验)、扩展能力(产品思维),这三方面的结合才能更好的开发程序。但也许野蛮人会喊,我写CRUD需要什么逻辑、数据结构、算法?但是写CRUD并不一定代表业务需求就是CRUD,而是你的知识和技术深度只能设计成CRUD。使用ifelse和for循环在类中重复粘贴和复制。也许同样的需求交给别人,他们会想的更多,建造的更完美。比如:一棵树上的10只鸟被射杀了,还剩下多少只?例如:手枪是静音的吗?枪声大吗?在这个城市射鸟违法吗?确保那只鸟被射死?树上有聋鸟吗?是否有鸟被关在笼子里或绑在树上?附近还有其他树吗?有残疾或不能移动的鸟类吗?射鸟的人是瞎子吗?有10个保证吗?有不怕死的鸟吗?它会一枪杀死两个或更多吗?所有的鸟都能自由活动并飞离树吗??被打死后是挂在树上还是掉下来了?那么,你还相信写程序只是简单的增删改查吗?接下来付哥给大家举几个例子!二、代码是数理逻辑的具体实现数据结构:数组、链表、红黑树算法逻辑:哈希、扰动函数、负载因子、拉链寻址,其实我们开发的业务程序,甚至CRUD,都是还要根据数理逻辑的具体实现过程。只是简单的业务有简单的数理逻辑,复杂的业务有复杂的数理逻辑。数理逻辑是对数据结构的运用,(例如:把大象分几步放进冰箱)合理的数据结构有利于数据逻辑的实现和复杂化。在我们常用的API中,HashMap就是一个很好的例子,它不仅使用了非常好的数据结构,而且实现了强大的数学逻辑。为此,HashMap成为了开发过程中非常常用的API,当然也成为了面试过程中被问到最多的技术点。图15-2HashMap中的数据结构和数理逻辑“重点”。HashMap涉及的知识点很多,包括数据结构、数组、链表、红黑树的使用,以及算法逻辑的实现:哈希、扰动函数、负载因子、zip寻址等等。而如果这些知识能够深入讲清楚,根本就没有必要死记硬背,更没有必要造火箭去面试。就像下面这个问题:HashMap是怎么来的?因为有很多业务开发需要以key和value的形式存储和获取数据。为什么要用hash来计算下标?因为通过hash值计算出的key碰撞率低。为什么要加扰动功能?由于扰动函数可以使数据哈希均匀,如果HashMap中的数据碰撞成一个短链表,HashMap的索引性能会大大降低。为什么会有链表?因为无论如何都有节点碰撞的可能,碰撞之后,HashMap选择了拉链寻址来存储数据。当然ThreadLocal中使用的是Fibonaccihash+openaddressing,有兴趣的也可以看看。为什么链表会转换成树呢?因为时间复杂度问题,链表的时间复杂度是O(n),越长越慢。为什么这棵树是红黑树?红黑树是平衡的,即黑色节点是平衡的。平衡的作用是控制整体的树高,让时间复杂度最终保持在O(logn),否则同Pie的树是没有意义的。为什么会有负载因子?加载因子决定了HashMap的高度。您可以将负载理解为卡车可以容纳多少货物。加载越多,阅读风险越高,加载越少。赚得越快,赚得越少。所以选择合适的尺寸0.75。为什么JDK8会在数据扩容时优化数据迁移?不就是因为计算哈希值和找到下标需要时间吗?找到了数学规律,直接迁移就足以提升性能了。“你有看到它吗?”HashMap完全是数据结构的综合运用和数理逻辑的完美结合,让我们有了一个非常好用的HashMap。这些知识的学习可以迁移到我们自己的业务开发中,可以将一些业务开发优化到非常好的性能。同时,你的代码也值得加薪!“哈希下标”图15-2中涉及的下标位置存储的数据不是乱写的。它是根据HashMap中的计算逻辑找到的固定位置值。代码如下:for(inti=1;i<1000;i++){Stringkey=String.valueOf(i);inthash=key.hashCode()^(key.hashCode()>>>16);intidx=(64-1)&hash;if(idx==2){//System.out.println(i+"Idx:"+idx);}if(idx==62){System.out.println(i+"Idx:"+idx);}}如果你需要英文,你可以运行一个100,000个单词的字典表。关于HashMap的内容傅老师在免井手册里已经整理过了,链接:免井手册?大厂优惠三、得舞(毒)8位随机抽奖码设计1、需求说明图15-3仿得舞(毒)APP抽奖码需求图15-3是我们模拟得舞中的抽奖码需求样式图应用程序。核心技术点包括:需要一个8位随机码,全球唯一。每个人可以获得多个这样的随机码,读取随机码的中奖概率更大。这里的随机码设计与毒app的显示形式略有不同,包括:大写字母、小写字母和数字。在看实现方案之前,可以先考虑如何生成这样一个独一无二的随机码。2.实现方案2.1基于Redis生成intcodeId=RedisUtil.incr("codeUUID");StringUUID=String.format("%08d",codeId);System.out.println(UUID);//测试结果000000010000000200000003分:?解决方案:基于Redis的incr方法,全局自增从0开始,以上为伪代码。点评:以上解决方案不可用。除了不一定保证全局自增和可靠性,还有一个很大的问题就是你的订单自增暴露了APP里有多少人参加了活动的数据。2.2随机数生成Randomrandom=newRandom();StringBuffercode=newStringBuffer();for(inti=0;i<8;i++){intnumber=random.nextInt(3);switch(number){case0:code.append((char)(random.nextInt(26)+65));//65~90break;case1:code.append((char)(random.nextInt(26)+97));//97~122break;case2:code.append((char)(random.nextInt(9)+48));//48~97break;}}System.out.println(code.toString());//测试结果qvY0Fqrk8uyehK3HU7z2v4qKscore:??Scheme:根据随机数生成8位随机码,相当于62^8次方,有近万亿个随机数。点评:这个方案在很多业务场景中都有使用,但是这里的实现还有一个问题,就是随机后的非唯一性,虽然我们知道这么大的体量很难出现两个完全相同的。但是,如果业务操作的使用随着时间的推移积累,最终会出现两个相同的随机数,只要出现,就是客户投诉。因此,需要保证唯一性。可以在随机数上加上年或者月的标记,按照这个量使用反重的方法来保证唯一性。当然你也可以有其他的方式来保证唯一基于雪花算法的2.3finalstaticchar[]digits={'0','1','3','2','4','7','6','5','8','z','A','B','C','D','E','F','G','H','I','J','K','L','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1',};publicstaticvoidmain(String[]args){SnowflakeIdWorkeridWorker=newSnowflakeIdWorker(0,0);System.out.println(idWorker.nextId());longcode=idWorker.nextId();char[]buf=newchar[64];intcharPos=64;intradix=1<<6;longmask=radix-1;do{buf[--charPos]=digits[(int)(code&mask)];code>>>=6;}while(code!=0);System.out.println(newString(buf,charPos,(64-charPos)));}//测试结果uxdDQOG001uxd8Uoj001uxdERuG000Score:???方案:基于雪花算法的核心目的,随机字符串本身就是一个唯一值,所以不需要考虑重复性。只需要将唯一值转换成64进制对应的字符串组合即可。点评:这里的思路很好,但是有几个问题需要解决。首先,雪花算法的长度是18位。转换为64位时,会出现10位随机串的组合,不符合要求。另外,大写字母、小写字母、数字的组合共有62种,还缺少2种不满足64的,所以后面还需要补充两位,但这两位生成的组合数需要被丢弃。“那么”,如果按照这种生成随机字符串并保证唯一性的思路,就需要在满足业务本身的前提下,改进雪花算法,减少位数,控制生成的长度。“实施方案”不会一次就完美,毕竟需要不断优化完善。除此之外,还有很多其他的想法。比如电商生成订单号的方案也可以考虑。另外,你觉得这就结束了吗?当你工作多年后,其实每天都在解决技术问题。数学题,产品需求更像是数学作业!加油,数学老师!4、一个好的程序的实现离不开数据结构的设计、逻辑算法的改进、设计模式的考虑,配合业务开发和程序设计,才能构建出更合理的程序。在学习的过程中,不要刻意死记硬背答案和套路,那不是科学内容的学习方式。只有多实践,多验证,让自己明白了,才会真正明白,才会更自在!这篇文章又谈到了这一点。我想问你一个问题。把知识学透,骗不了面试官,只能骗自己!