切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
设计模式
框架
大数据
物联网
实现方案
算法
分布式
第三方应用
消息中间件
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
进阶开发
二分法的一种应用
## 二分法示例 **场景说明:**某网站在录入房源信息中对房源价格有个最低要求的值,低于该值的情况下不予提交,高于最低值才能提交成功,现在需要根据以下几个条件计算出该单元房间的最低价格是多少 **已知条件有:**<mark>该小区的平均单价,要计算的房源面积</mark> <span style="color:red">**注意:**下面的例子我们是假设了我们已经知道的最低值是多少,正常的验证方法是需要求请求该网站的提交申请来验证我们的计算过是否正确的</span> ```csharp public static string[] hoomsNum = { "203" };//房号 public static string[] areas = { "141.76" };//面积 public static string[] communityIds = { "100383794"}; public static int price = 19047;//均价 public static decimal bfb = 0.15m;//递增与递减的阈值 public static int endPrice = 139;//目标价格(要求的价格) public static void GZDrop() { for (int n = 0; n < 1; n++) { int totalPrice = (int)(price * decimal.Parse(areas[n]) / 10000);//总价 int nowPrice = totalPrice;//当前价格 string msg = "";//返回的提示 bool IsEF = false;//是否进入二分算法 int okPrice = 0;//记录下成功的值 int noPrice = 0;//记录下失败的值 for (var i = 0; i < 100; i++) { //int excute = digui(nowPrice, n); int excute; msg = GetCheckPrice(areas[n], nowPrice.ToString(), communityIds[n]);//通过,不通过 if (msg == "通过") { if (okPrice == nowPrice || (okPrice - 1) == nowPrice) { excute = 0;//当前值等于限定值 } else { okPrice = nowPrice; if (!IsEF) { excute = 1;//递减 } else { IsEF = true; excute = 2;//进入二分法 } } } else { if (okPrice > 0)//有通过一次后判断 { if (okPrice == nowPrice || (okPrice - 1) == nowPrice) { excute = 0;//二分法到当前值和上次成功值相同或相差1时说明没发再分了,判断最上次成功的值为最低均价 } else { noPrice = nowPrice; IsEF = true; excute = 2;//当前值小于限定值 } } else { excute = 3;//递增 } } switch (excute) { case 0: Console.WriteLine("尝试" + i + "次成功![当前请求价格:" + nowPrice + ",成功价格" + okPrice + "--房号:" + hoomsNum[n] + "--面积:" + areas[n] + "]【" + msg + "】"); break; case 1: Console.WriteLine("进入递减尝试第" + i + "次!当前请求价格:" + nowPrice + ",成功价格" + okPrice + "【" + msg + "】"); nowPrice = nowPrice - (int)(nowPrice * bfb); break; case 2: Console.WriteLine("进入区间尝试第" + i + "次!当前请求价格:" + nowPrice + ",成功价格" + okPrice + "【" + msg + "】"); nowPrice = (int)(noPrice + okPrice) / 2; break; case 3: Console.WriteLine("进入递增尝试第" + i + "次!当前请求价格:" + nowPrice + ",成功价格" + okPrice + "【" + msg + "】"); nowPrice = nowPrice + (int)(nowPrice * bfb); break; } if (excute == 0) { break; } } Console.WriteLine("------------------------------------------最低价格为" + (msg == "通过" ? nowPrice : okPrice) + "------------------------------------------"); } } #endregion public static string GetCheckPrice(string allArea, string allPrice, string communityId) { if (allPrice == endPrice.ToString()) { return "通过"; } else { if (int.Parse(allPrice) > endPrice) { return "通过"; } else { return "不通过"; } } } ``` > 代码执行分析: > 此段代码的逻辑大概是,我们用均价去乘上面积计算出一个总价,然后用这个总价开始去做提交验证,以为价格低了是提交不了的,所以当我第一次不成功时我们就需要增加价格在去提交了,那个这个每次增加我们设置了一个增量阈值,用递归的方法一直递增这个阈值的价格,直到得到验证通过的数值,我们通过梯队同样也知道了这次成功的上一次失败的价格,那么该单元的最低房价就在这两个值之间了,最后我们采用二分法,对分区间,用的二分的数值去验证,如果通过则用失败值与这次二分后的值再去算二分法,如果未通过验证则用这次二分失败的值和最初成功的值去做二分法计算,用递归法,最后得到两个数无法再进行二分法计算时,那么我们就得到了我们需要的最低价格了。
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号