2021年12月9日|12月10日|
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日|相关推荐
- 使用Python对股票数据进行数据分析(一)-计算日线行情、5日均线、10日均线行情并显示
使用Python对股票数据进行数据分析(一)-计算日线行情.5日均线.10日均线行情并显示 各种炒股软件上可以显示各种技术指标,可以帮助投资者进行技术分析.这些股市中的这些指标都是怎么计算出来的呢?这 ...
- 使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情、5日均线、10日均线行情并显示
使用Python对股票数据进行数据分析(二)-使用ta-lib库获取日线行情.5日均线.10日均线行情并显示 这个文章其实和我的上一篇文章,https://blog.csdn.net/lost0910 ...
- R语言计算时间序列数据的移动平均值(滚动平均值、例如5日均线、10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值
R语言计算时间序列数据的移动平均值(滚动平均值.例如5日均线.10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值 目录
- cf12月9日服务器维护时间,cf12月9、10日全区全服维护更新公告_穿越火线更新公告_7k7k穿越火线...
cf12月9.10日维护更新公告 更新日期:2016-01-02 来源:7k7k 作者:7k7k挽歌 12月9.10日全区全服维护更新公告(已完成) 2015-12-08 23:34: ...
- 10日均线--操盘线
一.10日均线的要义 1.10日均线是短期均线,是短线的生命线,是波段操作的重要参考指标. 2.在上升趋势中,10日均线是有力的支撑线. 3.在下跌行情中,10日均线是重要的阻力线. 4.股价在高位跌 ...
- 5月10日12点,看雪.深信服2021 KCTF春季赛正式开赛!
5月10日12点,看雪.深信服2021 KCTF春季赛正式开赛!想要在这盛大赛事大展身手的你们,一定要抓住这次机会! 在这里你会收获到相关的实战经验,与志同道合的网络安全人才交流.切磋的机会,同时还有 ...
- 股票中5日均线连续金叉10日均线选股法
5日均线和10日均线相交叉常常成为我们选股和判断一只股票上涨的依据,但是在实际的应用中,大 家发现往往不是很准确,经常通过该依据买入就被套住,然后刚刚一卖出,就上涨,其实5日均线金叉10 日均线需要其 ...
- XSX和PS5对标的电脑配置(2021年12月10日分析)
Xbox Series X对标电脑配置(2021年12月10日下午) 前言 最近买了台小米电视86,光看电视感觉不过瘾,想玩点游戏. 但是专门买一个XSX或者PS5又感觉没必要,因为我也不是游戏重度爱 ...
- 2020德勤面试开始了吗_2020下半年教师资格证面试时间已出!12月10日开始报名
安徽省2020年下半年中小学教师资格考试面试详情 一.面试时间安排 (一)报名:2020年12月10日8:00-13日17:00: (二)审核:2020年12月10日8:00-14日17:00: (三 ...
最新文章
- 从零开始学习springboot之springboot搭建
- 德勒报告:2018年全球生命科学发展趋势
- zyUpload+struct2完成文件上传
- 翻译介绍15个经典的MDX查询-02and03
- Android的一个关于Activity和UI的小程序
- HTML5与HTML4的区别(译文)
- Android 绑定远程服务出现 Not Allowed to bind service
- mysql索引类型normal,unique,full text
- 8/7-8/8-8/9 今日TF训练
- IPTV 质量评价方法已经不适用于 OTT TV 质量评价
- IDE安装与配置(2018)
- win10右键文件夹转圈卡死
- 字符串与vector和list
- Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程
- MySQL8.0备份与还原工具讲解----mysqlbackup篇
- 诡异!意识何以意识到意识自身?道翰天琼认知智能机器人API接口平台为您揭秘。
- 软件工程 3:模块化设计
- 美颜SDK架构技术分析
- 在 Windows 安装期间将 MBR 磁盘转换为 GPT 磁盘
- MongoDB未授权访问漏洞