算法 可配置过滤时间段的有效工时算法

今天分享一下进公司以来我做的最“恶心”的项目中用到的一个算法。

故事背景

之所以说这个项目恶心,是因为从接到需求的那一刻起我就觉得做完这个项目我可能就会被全公司研发人员的唾沫星子给淹没,而且这个项目还映射着一个从华为挖过来的一个高管在公司里的起起落落。

这个项目的全称叫“工时任务填报审批系统”。

项目的功能是员工每日进行工时填报,每天完成了哪些工作内容,每个工作内容用了多少工时,然后提交到直接部门领导那里审批,部门领导也需要填写工时,填写的工时也由其直属领导进行审批。然后每月统计出所有员工的有效工时(领导审批时如果认为你填报的工作内容不值得你填写的那么多工时,还可以扣你的工时。。。……

阅读更多

python 如何遍历二维平面中指定点的对角线上的点

解决思路

上一篇文章描写的八皇后问题中,一个难点就在于如何判断棋盘上指定位置的对角线上是否已经有皇后棋子。

这个问题的实质是如何在一个有限二维平面(8*8)上遍历一个指定坐标点(x,y)的对角线上的所有点。

注:平面的坐标系,y轴横向右侧延伸(→),x轴在y轴下侧竖向下延伸(↓)

一个点的对角线有四个方向,分别是左上、右上、左下、右下

如果用坐标的变化趋势来表示这四个方向的话,这个问题就显得一目了然了:

  1. 左上:x轴坐标与y轴坐标相对于点(x,y)都在递减
  2. 右上:x轴坐标在递减,y轴坐标在递增
  3. 左下:x轴坐标在递增,y轴坐标在递减
  4. 右下:x轴坐标与y轴坐标相对于点(x,y)都在递增……

阅读更多

python 八皇后问题的解法(深度搜索)

共本文介绍如何用深度搜索的方式求解8皇后(其实也可以求解N皇后)问题的解

八皇后问题描述

在国际想起的规则中,皇后能攻击八个方向上的棋子,而且不受距离限制。

皇后的攻击方向如下图所示:

八皇后问题则是在这样的规则上,求在一个8*8的棋盘上,如何放置8个互相不会攻击的皇后。

比如下图这样放置:

8个皇后,每个都不在其他皇后的上下左右以及斜向的方向上,所以互相不能攻击。

ps:我写的这份代码其实也可以求N皇后问题的解,只需修改MAXNUM为指定N值即可

代码原理

从棋盘的第一行开始,从左到右的查看每一列,当检测到当前点可以放置皇后,则将该点置为1。

然后查找下一行可……

阅读更多

分班算法实现过程中的效果以及性能优化

之前在这篇文章:基于班级条件权重表的试探性学生分班算法(详解篇)中介绍过分班算法的理论步骤。

分班算法设计仅仅是给出了一个大致的思路。

其实算法中的很多步骤在实现过程中是可以进一步优化的。

本篇文章记录一下我在实现分班算法的过程中,进行的一些优化,主要包括以下几方面:

1. 单一条件分班时采用循环算法得到最优解
2. 可配置的权重系数计算规则
3. 增加redis锁防止重复分班
4. 引入线程池将分班过程多线程化

单一条件分班时的特殊处理

单一条件分班其实是一种特殊的分班情况,这种情况下的分班结果是有最优解的,达成最优解的分班方式就是将所有学生按照分班条件排序,然后循环分班。……

阅读更多

基于班级条件权重表的试探性学生分班算法(详解篇)

由于markdown语法展示的文档样式可能不太好看,因此提供doc版下载:

点此下载:
基于班级条件权重表的试探性学生分班算法.doc

目录

1 学生分班业务分析
    1.1 需求分析
    1.2 难点分析
2 分班问题的解决思路
3 基于班级条件权重表的试探性学生分班算法
    3.1 算法步骤
    3.2 算法详解
        3……

阅读更多

排序算法:希尔排序(更高效的插入法排序)

希尔排序:
      希尔排序,英文名Shell Sort,又被称为缩小增量排序。无论是中文名,英文名,还是别名,都透露着一股学渣不可侵犯的“神圣”感。当初学习插入法的时候,一看到这么接地气的名字,学起来也有信心。但是看到希尔排序这高端大气上档次的名字,一下子就起了退避三舍的心思。那么,希尔排序真的就这么的拒人于千里之外吗?其实学会了希尔排序的思路后,就不觉得它有多难了。

      希尔排序其实也是插入排序的一种,不过希尔排序是将序列按下标的一定增量分组,分别对每组序列……

阅读更多

排序算法:二分法插入排序

二分法插入排序:
      在上一篇文章排序算法:插入排序中,介绍了插入排序。其中,插入排序的“插入”二字体现于在寻找有序区间[R0,Ri-1]内第一个比Ri小的Rx,然后将Ri插入Rx之后,如果Ri>Ri-1,那正好,Ri不需要再与有序区间的其他元素比较。
      二分法插入排序沿用了插入排序的思路,而且由于[R0,Ri-1]是有序序列,在寻找Ri的插入位置时,可以采用二分查找法搜索有序区间中比第一个Ri小的元素,这样就减少了比较次数,提高了插入排序算法的性能。

以长……

阅读更多

排序算法:插入排序

插入排序思路:
      对于长度为n的序列来说,在插入元素Ri(i=1,2,…,n-1)时,序列被划分为两个区间,分别是[R0,Ri-1]和[Ri,Rn-1],其中[R0,Ri-1]已经排好序,即Ri-1>=Ri-2>=…>=R0,而[Ri,Rn-1]为待排序列。将Ri分别与Ri-1,Ri-2,…,R0比较,当Ri<=Rx时,将Ri插入Rx之前(若Ri>=Ri-1,则Ri不需要移动位置)。此时有序序列的区间元素又增加一位。当从i=1进行上述排序操作知道i=n-1时,序列将变为有序。

以长度为6的序列 {6,3,5,4,……

阅读更多

排序算法:选择排序

选择排序思路:
      每次从序列中选取最小的元素与序列前端的元素交换,依次类推,对于长度为n的序列,进行n-1趟排序后序列将变为有序。
      由于每趟排序过程中,都是比较完成后才进行交换,所以选择排序的交换次数为n-1次,如果考虑到最小元素可能就是当前元素无需交换,则选择排序的交换次数<=n-1。

以长度为6的序列 {6,3,5,4,1,2} 的选择排序过程做示范:
第一趟排序:[1] 3 5 4 6 2 (最小元素1与6交换)
第二趟排序:[1 2]……

阅读更多

排序算法:冒泡排序

冒泡法排序思路:
      先将序列中的第一个记录R1与第二个记录R2比较,若R1>R2,则把R1,R2交换位置,然后处理新的R2,R3,直到Rn-1和Rn也做了上述操作,此时就完成了一趟排序,由上述的操作可知,最大的记录将被交换的第n位上。在执行下一趟排序时,因为前一趟排序已将序列最大值排到最后,所以只需进行n-1次比较,即将第二大的记录交换到第n-1位。依次类推,直到做完n-1趟比较,序列将变为有序序列。
      由于上述的排序过程中,越大的元素会经由交换慢慢“浮”到……

阅读更多