2021年12月7日|8日|9日|10日

  • 完成POI关键字搜索--高d地图
  • 公交线路--百d地图
  • LeetCode视频
    • P2 认识复杂度和简单排序算法
      • 选择排序
      • 冒泡排序
      • 异或运算
        • 异或简介及原理
        • 异或习题
        • 取二进制数最右边的1
      • 插入排序
      • 二分法的详解与扩展
        • 在一个有序数组中,找某个数是否存在
        • 在一个有序数组中,找>=某个数最左侧的位置
        • 局部最小值问题
      • 对数器的概念和使用
        • 概念
        • 范例
      • 剖析递归行为及其算法复杂度的估算
        • 使用Master公式估计递归时间复杂度

完成POI关键字搜索–高d地图

# -*- coding: utf-8 -*-
# Author = dd
# Creation Date :2021/12/7
# Desc:基础类import os
import json
import urllib3class PointWithAttr(object):# def __init__(self, id, lon, lat):#     self.id = id#     self.lon = lon#     self.lat = lat#     self.name = ""#     self.name1 = ""def __init__(self, id, lon, lat, type, name):self.id = idself.lon = lonself.lat = latself.type = typeself.name = nameclass BoundryWithAttr(object):def __init__(self, point, boundrycoords):self.point = pointself.boundrycoords = boundrycoordsclass LineWithAttr(object):def __init__(self, name, coords):self.name = name# coords数据类型为列表self.coords = coords# 从文本文件读取点数据并生成PointWithAttr对象
def createpoint(filename, idindex, lonindex, latindex, nameindex, name1index):doc = open(filename, 'r')lines = doc.readlines()doc.close()points = []for line in lines:linesplit = line.split(',')id = linesplit[idindex]lon = linesplit[lonindex]lat = linesplit[latindex].replace("\n", "")name = linesplit[nameindex]name1 = linesplit[name1index]point = PointWithAttr(id, lon, lat, name, name1)points.append(point)return points# 合并文件夹outputdirectory下的所有文本文件到finalfile
def mergetxt(outputdirectory, finalfile):f = open(finalfile, 'w')f.close()f = open(finalfile, 'a')for filename in os.listdir(outputdirectory):file_path = os.path.join(outputdirectory, filename)file1 = open(file_path, 'r')context = file1.read()file1.close()f.write(context)f.close()# 百度坐标系转换为国测局坐标(火星坐标,高德坐标,腾讯坐标)# def BDtoGCJ(ak,oldPoint):
# -*- coding: utf-8 -*-
# Author = dd
# Creation Date :2021/12/7
# Desc:地图时空大数据挖掘 chapter 4.pyimport json
from urllib import request, error
import sys
import os
import Basics.basics# 以关键字搜索,每次最多返回1000个POI信息,适合数量较少的POI类型
# 给出POI类型(POIType)和行政区编码(CityCode),获取包含所有POI的列表POIListdef getPOIKeyWords(poitype, citycode):POIList = []for page in range(1, 46):url = "http://restapi.amap.com/v3/place/text?key=" + ak + \"&keywords=&types=" + poitype + "&city=" + citycode + \"&children=1&offset=20&page=" + str(page) + "&extensions=all"# print urljson_obj = request.urlopen(url)json_data = json.load(json_obj)try:pois = json_data['pois']except Exception as e:print("错误", url)print(e)continueif (pois != []):  # 如果第i页不为空for j in range(0, len(pois)):poi_j = pois[j]id = poi_j['id']lon = float(poi_j['location'].split(',')[0])lat = float(str(poi_j['location']).split(',')[1])name = poi_j['name']poi = Basics.basics.PointWithAttr(id, lon, lat, poitype, name)  # 将type加入POIList.append(poi)return POIList# 将POI写入txt文件
def writePOIs2File(POILIst, outputfile):f = open(outputfile, 'a')for i in range(0, len(POILIst)):f.write(POILIst[i].id + ";" + POILIst[i].name + ";" + POILIst[i].type \+ ";" + str(POILIst[i].lon) + ";" + str(POILIst[i].lat) + "\n")f.close()if __name__ == '__main__':# 密钥akak = '353dcb98338d341d44be1879dbdbabc5'# 将采集的POI数据保存在output_directory文件夹里output_directory = "C:\\Users\\delll\\Desktop\\Test\\"if not os.path.exists(output_directory + "poi\\"):os.mkdir(output_directory + "poi\\")try:typefile = open(output_directory + "poitype.txt", 'r')except Exception as e:print("错误提示:请将poitype.txt复制到" + output_directory + "下")poitypeList = typefile.readlines()for poitype in poitypeList:poitype = poitype.split('\n')[0]# print(poitype)# 行政区域编码citycodescitycodes = {'玄武区': '320102'}for citycode in citycodes.values():# 调用关键字搜索的getPOIKeywords函数,获取POI数量较少的类别POIList = getPOIKeyWords(poitype, citycode)outputfile = output_directory + "poi\\" + poitype + "_" + citycode \+ "_keywords.txt"f = open(outputfile, 'w')f.close()print(citycode, poitype, len(POIList))writePOIs2File(POIList, outputfile)Basics.basics.mergetxt(output_directory + "poi\\", output_directory + "finnal.txt")

公交线路–百d地图

城市名称是写死的,换城市需要修改代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=gGyhEs7Dmkya0v1vgM0luIkzdIWQHps7"></script><title>公交路径点采集</title>
</head>
<body><p>城市名称:<input type="text" value="深圳" id ="cityName" /></p><p>公交名称:<input tyep="text" value = "11" id ="busId" /><input type = "button" value = "查询" onclick ="busSearch();" />(多条线路查询用逗号分割)</p><div><table id="data"><thead><tr style="text-align:center;width:100%;"><td colspan="7" style="font-size:larger;">公交信息</td></tr><tr style ="text-align:left;width:100%;"><td colspan="7" style ="font-size:larger;">名称,开始时间,结束时间,公交公司,站台数,轨迹点</td></tr></thead><tbody id = "tabledata" style = "height:100%;width:100%;padding:0;"></tbody></table></div>
</body>
</html>
<script type ="text/javascript">var buslinevar dataHtml = ''busline = new BMap.BusLineSearch(document.getElementById("cityName").value,{onGetBusListComplete:function(result){if(result){lineNum = result.getNumBusList()//去程公交var fstLine = result.getBusListItem(0);busline.getBusLine(fstLine);}},onGetBusLineComplete:function(busline){if (busline){//公交信息var startTime = busline.startTime;var endTime = busline.endTime;var company = busline.company;var numBusStations = busline.getNumBusStations();var name = busline.namevar data = name + ';' + startTime + ';' + endTime +';' + company + ';' + numBusStations + "<br>";dataHtml += data// 公交轨迹点信息var points = busline.getPath();var path = "";var linedata = "";for (var i = 0 ; i < points.length; i++) {path += points[i].lng;path += ",";path += points[i].lat;path += ";";}dataHtml =dataHtml + path + "<br>";document.getElementById("tabledata").innerHTML = dataHtml;}}});function busSearch(){tabledataHtml = ''tabledataPath = ''var busName = document.getElementById("busId").value;if(busName != ''){var list = busName.split(/[,,]/);//正则表达式if (list.length>0){for(var kk = 0;kk <list.length;kk++){busline.getBusList(list[kk])}}else{alert('请输入查询公交名称')}}}
</script>

LeetCode视频

P2 认识复杂度和简单排序算法

选择排序

package class01;import java.util.Arrays;public class Code01_SelectionSort {public static void selectionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {minIndex = arr[j] < arr[minIndex] ? j : minIndex;}swap(arr, i, minIndex);}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}// for testpublic static void comparator(int[] arr) {Arrays.sort(arr);}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for testpublic static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);selectionSort(arr1);comparator(arr2);if (!isEqual(arr1, arr2)) {succeed = false;printArray(arr1);printArray(arr2);break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");int[] arr = generateRandomArray(maxSize, maxValue);printArray(arr);selectionSort(arr);printArray(arr);}
}

冒泡排序


package class01;
import java.util.Arrays;public class Code02_BubbleSort {public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int e = arr.length - 1; e > 0; e--) {for (int i = 0; i < e; i++) {if (arr[i] > arr[i + 1]) {swap(arr, i, i + 1);}}}}public static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}// for testpublic static void comparator(int[] arr) {Arrays.sort(arr);}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for testpublic static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);bubbleSort(arr1);comparator(arr2);if (!isEqual(arr1, arr2)) {succeed = false;break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");int[] arr = generateRandomArray(maxSize, maxValue);printArray(arr);bubbleSort(arr);printArray(arr);}
}

异或运算

异或简介及原理

不同为1,相同为0 即为异或运算(⊕)
也可以理解为 "无进位相加"a: 10110b: 00111
异或: 10001
----------------------------
性质1:0 ⊕ N =N    N⊕N = 0
性质2:交换律:a⊕b=b⊕a结合律:a⊕b⊕c=a⊕(b⊕c)
===>推出性质3同一批数异或 其结果和异或顺序无关
Case:int a = 甲 int b = 乙
经过[a = a ⊕ b   ==> a= 甲⊕乙                      b = 乙b = a ⊕ b   ==> a= 甲⊕乙                      b = 甲 ⊕ 乙 ⊕ 乙 = 甲a = a ⊕ b]  ==> a= 甲⊕乙⊕甲 = 甲⊕甲⊕乙 = 乙     b = 甲三步操作后**a和b值互换(并未占用其他变量空间) 前提:A和B在内存中是独立的两块区域**

异或习题

已知某整形数组 有一种数出现了奇数次,其他数出现了偶数次
1) 怎么找到出现奇数次的数?
2) 如果又两种数出现了奇数次,其他所有数都出现了偶数次 如何找到这种数?
时间复杂度要求:O(N)
空间复杂度要求:O(1)
-----------------------------------------------------------
1) int eor = 0对于数组[a,b,c..........] 用eor对每一个数异或eor = eor⊕aeor = eor⊕beor = eor⊕c.......eor = eor⊕eor⊕eor....a⊕b⊕c....↑奇数个+偶数个   ↑奇数个+偶数个= eor⊕0⊕X⊕0= X (这里用到了0⊕N=N的性质)偶次奇次异或 偶次异或全为00不论异或奇数次还是偶数次结果都为0(0的异或运算有点像1的乘法运算)
-----------------------------------------------------------
2) 首先可以明确a≠b 则以二进制表示a和b时 两者必有一位不相同(一个为0另一个为1)eor从头到位异或 结果得到 eor = a⊕b以两者不同的那一位为分类标准,整个数组可以被分为两类(该位为1的类和该位为0的位且a和b必不会落入同一类eor'从头到尾异或其中一类 结果得到 eor' = a 或 eor' = b另一个数通过eor⊕eor'得到
package class01;public class Code07_EvenTimesOddTimes {public static void printOddTimesNum1(int[] arr) {int eO = 0;for (int cur : arr) {eO ^= cur;}System.out.println(eO);}public static void printOddTimesNum2(int[] arr) {int eO = 0;// eorint eOhasOne = 0;// eor'for (int curNum : arr) {eO ^= curNum;}//eor  = a ^ b//eor != 0//eor必然有一个位置上是1 即 a和b 二进制数值不同的位int rightOne = eO & (~eO + 1); // 提取出最右的1 ~取反 &与运算for (int cur : arr) {if ((cur & rightOne) != 0) {eOhasOne ^= cur;}}System.out.println(eOhasOne + " " + (eO ^ eOhasOne));}public static void main(String[] args) {int a = 5;int b = 7;a = a ^ b;b = a ^ b;a = a ^ b;System.out.println(a);System.out.println(b);int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };printOddTimesNum1(arr1);int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };printOddTimesNum2(arr2);}
}

取二进制数最右边的1

【方法】
----------------------------------
N&(~N+1) N为二进制数
----------------------------------

插入排序

package class01;import java.util.Arrays;public class Code03_InsertionSort {public static void insertionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 1; i < arr.length; i++) {for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {swap(arr, j, j + 1);}}}public static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}// for testpublic static void comparator(int[] arr) {Arrays.sort(arr);}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {//Math.random()            -> [0,1) 所有的小数,等概率返回一个//Math.random()*N           -> [0,N)  所有的小数,等概率返回一个//(int)(Math.random() * N ) -> [0.N-1]所有的整数,等概率返回一个int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for test// 对数器示范public static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);insertionSort(arr1);comparator(arr2);if (!isEqual(arr1, arr2)) {succeed = false;break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");int[] arr = generateRandomArray(maxSize, maxValue);printArray(arr);insertionSort(arr);printArray(arr);}
}

二分法的详解与扩展

在一个有序数组中,找某个数是否存在

package class01;public class Code04_BSExist {public static boolean exist(int[] sortedArr, int num) {if (sortedArr == null || sortedArr.length == 0) {return false;}int L = 0;int R = sortedArr.length - 1;int mid = 0;while (L < R) {mid = L + ((R - L) >> 1);if (sortedArr[mid] == num) {return true;} else if (sortedArr[mid] > num) {R = mid - 1;} else {L = mid + 1;}}return sortedArr[L] == num;}
}

在一个有序数组中,找>=某个数最左侧的位置

package class01;public class Code05_BSNearLeft {// 在arr上,找满足>=value的最左位置public static int nearestIndex(int[] arr, int value) {int L = 0;int R = arr.length - 1;int index = -1;while (L <= R) {// mid = (L+R)/2 的漏洞:L+R 若溢出,/2则会出现负数int mid = L + ((R - L) >> 1);// 为了防止溢出if (arr[mid] >= value) {index = mid;R = mid - 1;} else {L = mid + 1;}}return index;}
}

局部最小值问题

对数器的概念和使用

概念

1,有一个你想要测的方法a
2,实现复杂度不好但是容易实现的方法b
3,实现一个随机样本产生器
4,把方法a和方法b跑相同的随机样本,看看得到的结果是否一样
5,如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a或者方法b
6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确

范例

见插入排序相关代码

剖析递归行为及其算法复杂度的估算

下面求最值的递归方法其实就是利用栈来实现一个树的遍历(后序遍历)
占用的栈空间就是整棵树的高度

package class01;// 一个求最大值的递归方法public class Code08_GetMax {public static int getMax(int[] arr) {return process(arr, 0, arr.length - 1);}public static int process(int[] arr, int L, int R) {if (L == R) {return arr[L];}int mid = L + ((R - L) >> 1);int leftMax = process(arr, L, mid);int rightMax = process(arr, mid + 1, R);return Math.max(leftMax, rightMax);}
}

使用Master公式估计递归时间复杂度

只要子问题规模相同,都可以使用Master公式求解

2021年12月9日|12月10日|相关推荐

  1. 使用Python对股票数据进行数据分析(一)-计算日线行情、5日均线、10日均线行情并显示

    使用Python对股票数据进行数据分析(一)-计算日线行情.5日均线.10日均线行情并显示 各种炒股软件上可以显示各种技术指标,可以帮助投资者进行技术分析.这些股市中的这些指标都是怎么计算出来的呢?这 ...

  2. 使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情、5日均线、10日均线行情并显示

    使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情.5日均线.10日均线行情并显示 这个文章其实和我的上一篇文章,https://blog.csdn.net/lost0910 ...

  3. R语言计算时间序列数据的移动平均值(滚动平均值、例如5日均线、10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值

    R语言计算时间序列数据的移动平均值(滚动平均值.例如5日均线.10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值 目录

  4. cf12月9日服务器维护时间,cf12月9、10日全区全服维护更新公告_穿越火线更新公告_7k7k穿越火线...

    cf12月9.10日维护更新公告 更新日期:2016-01-02     来源:7k7k     作者:7k7k挽歌 12月9.10日全区全服维护更新公告(已完成) 2015-12-08 23:34: ...

  5. 10日均线--操盘线

    一.10日均线的要义 1.10日均线是短期均线,是短线的生命线,是波段操作的重要参考指标. 2.在上升趋势中,10日均线是有力的支撑线. 3.在下跌行情中,10日均线是重要的阻力线. 4.股价在高位跌 ...

  6. 5月10日12点,看雪.深信服2021 KCTF春季赛正式开赛!

    5月10日12点,看雪.深信服2021 KCTF春季赛正式开赛!想要在这盛大赛事大展身手的你们,一定要抓住这次机会! 在这里你会收获到相关的实战经验,与志同道合的网络安全人才交流.切磋的机会,同时还有 ...

  7. 股票中5日均线连续金叉10日均线选股法

    5日均线和10日均线相交叉常常成为我们选股和判断一只股票上涨的依据,但是在实际的应用中,大 家发现往往不是很准确,经常通过该依据买入就被套住,然后刚刚一卖出,就上涨,其实5日均线金叉10 日均线需要其 ...

  8. XSX和PS5对标的电脑配置(2021年12月10日分析)

    Xbox Series X对标电脑配置(2021年12月10日下午) 前言 最近买了台小米电视86,光看电视感觉不过瘾,想玩点游戏. 但是专门买一个XSX或者PS5又感觉没必要,因为我也不是游戏重度爱 ...

  9. 2020德勤面试开始了吗_2020下半年教师资格证面试时间已出!12月10日开始报名

    安徽省2020年下半年中小学教师资格考试面试详情 一.面试时间安排 (一)报名:2020年12月10日8:00-13日17:00: (二)审核:2020年12月10日8:00-14日17:00: (三 ...

最新文章

  1. 从零开始学习springboot之springboot搭建
  2. 德勒报告:2018年全球生命科学发展趋势
  3. zyUpload+struct2完成文件上传
  4. 翻译介绍15个经典的MDX查询-02and03
  5. Android的一个关于Activity和UI的小程序
  6. HTML5与HTML4的区别(译文)
  7. Android 绑定远程服务出现 Not Allowed to bind service
  8. mysql索引类型normal,unique,full text
  9. 8/7-8/8-8/9 今日TF训练
  10. IPTV 质量评价方法已经不适用于 OTT TV 质量评价
  11. IDE安装与配置(2018)
  12. win10右键文件夹转圈卡死
  13. 字符串与vector和list
  14. Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程
  15. MySQL8.0备份与还原工具讲解----mysqlbackup篇
  16. 诡异!意识何以意识到意识自身?道翰天琼认知智能机器人API接口平台为您揭秘。
  17. 软件工程 3:模块化设计
  18. 美颜SDK架构技术分析
  19. 在 Windows 安装期间将 MBR 磁盘转换为 GPT 磁盘
  20. MongoDB未授权访问漏洞

热门文章

  1. C语言编写规范之注释
  2. 对比度和色彩的三要素——色相、明度、纯度
  3. C#已知起点坐标、角度、长度求终点坐标(三角函数)
  4. flex中dataGrid的编辑功能
  5. WIFI知识 - MCS简介
  6. stm32f4xx_it.c: Error: C3065E: type of input file 'DRIVER' unknown 解决办法
  7. 《菊次郎的夏天》---温情的北野武,诗意的久石让
  8. LINUX下安装中文输入法
  9. 2017目标跟踪算法综述
  10. Windows下搭建免费个人博客